def get(self): """ Processes get requests """ logger.debug("Client args for GET: {0}".format(self._args)) if len(self._args) == 0: # Gets version url = self._request.build_absolute_uri(reverse('page.client-download')) return Client.result({ 'availableVersion': CLIENT_VERSION, 'requiredVersion': REQUIRED_CLIENT_VERSION, 'downloadUrl': url }) if len(self._args) == 1: # Simple test return Client.result(_('Correct')) try: ticket, scrambler = self._args # If more than 2 args, got an error hostname = self._params['hostname'] # Or if hostname is not included... srcIp = self._request.ip # Ip is optional, if GlobalConfig.HONOR_CLIENT_IP_NOTIFY.getBool() is True: srcIp = self._params.get('ip', srcIp) except Exception: raise RequestError('Invalid request') logger.debug('Got Ticket: {}, scrambled: {}, Hostname: {}, Ip: {}'.format(ticket, scrambler, hostname, srcIp)) try: data = TicketStore.get(ticket) except Exception: return Client.result(error=errors.ACCESS_DENIED) self._request.user = User.objects.get(uuid=data['user']) try: logger.debug(data) res = userServiceManager().getService(self._request.user, self._request.ip, data['service'], data['transport']) logger.debug('Res: {}'.format(res)) ip, userService, userServiceInstance, transport, transportInstance = res password = cryptoManager().symDecrpyt(data['password'], scrambler) userService.setConnectionSource(srcIp, hostname) # Store where we are accessing from so we can notify Service transportScript, signature, params = transportInstance.getEncodedTransportScript(userService, transport, ip, self._request.os, self._request.user, password, self._request) logger.debug('Signature: {}'.format(signature)) logger.debug('Data:#######\n{}\n###########'.format(params)) return Client.result(result={ 'script': transportScript, 'signature': signature, # It is already on base64 'params': json.dumps(params).encode('bz2').encode('base64'), }) except ServiceNotReadyError as e: # Refresh ticket and make this retrayable TicketStore.revalidate(ticket, 20) # Retry will be in at most 5 seconds return Client.result(error=errors.SERVICE_IN_PREPARATION, errorCode=e.code, retryable=True) except Exception as e: logger.exception("Exception") return Client.result(error=six.text_type(e)) # Will never reach this raise RuntimeError('Unreachable point reached!!!')
def get(self): # pylint: disable=too-many-locals """ Processes get requests """ logger.debug('Client args for GET: %s', self._args) if not self._args: # Gets version return Client.result({ 'availableVersion': CLIENT_VERSION, 'requiredVersion': REQUIRED_CLIENT_VERSION, 'downloadUrl': self._request.build_absolute_uri( reverse('page.client-download')) }) if len(self._args) == 1: # Simple test return Client.result(_('Correct')) try: ticket, scrambler = self._args # If more than 2 args, got an error. pylint: disable=unbalanced-tuple-unpacking hostname = self._params[ 'hostname'] # Or if hostname is not included... srcIp = self._request.ip # Ip is optional, if GlobalConfig.HONOR_CLIENT_IP_NOTIFY.getBool() is True: srcIp = self._params.get('ip', srcIp) except Exception: raise RequestError('Invalid request') logger.debug('Got Ticket: %s, scrambled: %s, Hostname: %s, Ip: %s', ticket, scrambler, hostname, srcIp) try: data = TicketStore.get(ticket) except Exception: return Client.result(error=errors.ACCESS_DENIED) self._request.user = User.objects.get(uuid=data['user']) try: logger.debug(data) ip, userService, userServiceInstance, transport, transportInstance = userServiceManager( ).getService(self._request.user, self._request.os, self._request.ip, data['service'], data['transport']) logger.debug('Res: %s %s %s %s %s', ip, userService, userServiceInstance, transport, transportInstance) password = cryptoManager().symDecrpyt(data['password'], scrambler) userService.setConnectionSource( srcIp, hostname ) # Store where we are accessing from so we can notify Service transportScript, signature, params = transportInstance.getEncodedTransportScript( userService, transport, ip, self._request.os, self._request.user, password, self._request) logger.debug('Signature: %s', signature) logger.debug('Data:#######\n%s\n###########', params) return Client.result( result={ 'script': transportScript, 'signature': signature, # It is already on base64 'params': encoders.encode(encoders.encode(json.dumps(params), 'bz2'), 'base64', asText=True), }) except ServiceNotReadyError as e: # Refresh ticket and make this retrayable TicketStore.revalidate( ticket, 20) # Retry will be in at most 5 seconds, so 20 is fine :) return Client.result(error=errors.SERVICE_IN_PREPARATION, errorCode=e.code, retryable=True) except Exception as e: logger.exception("Exception") return Client.result(error=str(e))
def get(self): ''' Processes get requests ''' logger.debug("Client args for GET: {0}".format(self._args)) if len(self._args) == 0: # Gets version url = self._request.build_absolute_uri(reverse('ClientDownload')) return Client.result({ 'availableVersion': CLIENT_VERSION, 'requiredVersion': REQUIRED_CLIENT_VERSION, 'downloadUrl': url }) if len(self._args) == 1: # Simple test return Client.result(_('Correct')) try: ticket, scrambler = self._args # If more than 2 args, got an error hostname = self._params['hostname'] # Or if hostname is not included... srcIp = self._request.ip # Ip is optional, if GlobalConfig.HONOR_CLIENT_IP_NOTIFY.getBool() is True: srcIp = self._params.get('ip', srcIp) except Exception: raise RequestError('Invalid request') logger.debug('Got Ticket: {}, scrambled: {}, Hostname: {}, Ip: {}'.format(ticket, scrambler, hostname, srcIp)) try: data = TicketStore.get(ticket) except Exception: return Client.result(error=errors.ACCESS_DENIED) self._request.user = User.objects.get(uuid=data['user']) try: logger.debug(data) res = userServiceManager().getService(self._request.user, self._request.ip, data['service'], data['transport']) logger.debug('Res: {}'.format(res)) ip, userService, userServiceInstance, transport, transportInstance = res password = cryptoManager().xor(data['password'], scrambler).decode('utf-8') userService.setConnectionSource(srcIp, hostname) # Store where we are accessing from so we can notify Service transportScript = transportInstance.getUDSTransportScript(userService, transport, ip, self._request.os, self._request.user, password, self._request) logger.debug('Script:\n{}'.format(transportScript)) return Client.result(result=transportScript.encode('bz2').encode('base64')) except ServiceNotReadyError as e: # Refresh ticket and make this retrayable TicketStore.revalidate(ticket, 20) # Retry will be in at most 5 seconds return Client.result(error=errors.SERVICE_IN_PREPARATION, errorCode=e.code, retryable=True) except Exception as e: logger.exception("Exception") return Client.result(error=six.text_type(e)) # Will never reach this raise RuntimeError('Unreachable point reached!!!')