def __invoke(self, name, args, byRef, encryptmode): data = {'result' : None, 'warning' : None, 'output' : ''} try: try : if encryptmode == None: encryptmode = self.__encryptmode self.__lock1.acquire() try: encryptmode = self.__key_exchange(encryptmode) finally: self.__lock1.release() result = self.__post("phprpc_func=%s&phprpc_args=%s&phprpc_encrypt=%s&phprpc_ref=%s" % ( name, base64.b64encode(self.__encrypt(phpformat.serialize(args), 1, encryptmode)).replace('+', '%2B'), encryptmode, str(byRef).lower() )) if result.has_key('phprpc_errstr') and result.has_key('phprpc_errno'): if (int(result['phprpc_errno']) == 0): warning = None else: warning = PHPRPC_Error(int(result['phprpc_errno']), base64.b64decode(result['phprpc_errstr'])) elif result.has_key('phprpc_functions'): warning = PHPRPC_Error(1, "PHPRPC server haven't received the POST data!") else: warning = PHPRPC_Error(1, "PHPRPC server occured unknown error!") data['warning'] = warning if result.has_key('phprpc_output'): output = base64.b64decode(result['phprpc_output']) if self.__server_version >= 3: output = self.__decrypt(output, 3, encryptmode) else: output = '' data['output'] = output if result.has_key('phprpc_result'): if result.has_key('phprpc_args'): #arguments = phpformat.unserialize(self.__decrypt(base64.b64decode(result['phprpc_arg']), 1, encryptmode)) arguments = phpformat.unserialize(self.__decrypt(base64.b64decode(result['phprpc_args']), 1, encryptmode)) #for key in arguments: args[key] = arguments[key] if isinstance(args, types.ListType) : for key in arguments: args[key] = arguments[key] data['result'] = phpformat.unserialize(self.__decrypt(base64.b64decode(result['phprpc_result']), 2, encryptmode)) else: data['result'] = warning except PHPRPC_Error, e: data['result'] = e except Exception, ex: if ex is types.StringType: data['result'] = PHPRPC_Error(1, ex) else: e = tuple(ex) if (len(e) == 2) and (type(e[0]) is types.IntType) and (type(e[1]) is types.StringType): data['result'] = PHPRPC_Error(e[0], e[1]) else: data['result'] = PHPRPC_Error(1, str(ex))
def __key_exchange(self, encryptmode): if (self.__key != None) or (encryptmode == 0): return encryptmode if (self.__key == None) and (self.__keyexchanged): return 0 result = self.__post("phprpc_encrypt=true&phprpc_keylen=%i" % self.__keylength) if result.has_key('phprpc_keylen') : self.__keylength = int(result['phprpc_keylen']) else : self.__keylength = 128 if result.has_key('phprpc_encrypt'): encrypt = phpformat.unserialize(base64.b64decode(result['phprpc_encrypt'])) x = random.randint(1 << (self.__keylength - 2), 1 << (self.__keylength - 1)) key = pow(long(encrypt['y']), x, long(encrypt['p'])) if self.__keylength == 128: key = hex(key)[2:-1].rjust(32, '0') self.__key = ''.join((chr(int(key[i*2:i*2+2], 16)) for i in xrange(16))) else: self.__key = md5.new(str(key)).digest() y = pow(long(encrypt['g']), x, long(encrypt['p'])) self.__post('phprpc_encrypt=%s' % y) else: self.__key = None self.__keyexchanged = True self.__encryptmode = 0 encryptmode = 0 return encryptmode
class DHParams: lengths = [96, 128, 160, 192, 256, 512, 768, 1024, 1536, 2048, 3072, 4096] dhparams_gen = {} __dir__ = os.path.dirname(__file__) for length in lengths: dhparams_gen[length] = phpformat.unserialize( open("%s/dhparams/%s.dhp" % (__dir__, length), 'rb').read()) def get_nearest(cls, n): j = 0 m = abs(cls.lengths[0] - n) for i in xrange(len(cls.lengths)): t = abs(cls.lengths[i] - n) if m > t: (m, j) = (t, i) return cls.lengths[j] get_nearest = classmethod(get_nearest) def get(cls, length): length = cls.get_nearest(length) dhparams = cls.dhparams_gen[length] return [length, dhparams[random.randint(0, len(dhparams))]] get = classmethod(get)
def __key_exchange(self, encryptmode): if (self.__key != None) or (encryptmode == 0): return encryptmode if (self.__key == None) and (self.__keyexchanged): return 0 result = self.__post("phprpc_encrypt=true&phprpc_keylen=%i" % self.__keylength) if result.has_key('phprpc_keylen'): self.__keylength = int(result['phprpc_keylen']) else: self.__keylength = 128 if result.has_key('phprpc_encrypt'): encrypt = phpformat.unserialize( base64.b64decode(result['phprpc_encrypt'])) x = random.randint(1 << (self.__keylength - 2), 1 << (self.__keylength - 1)) key = pow(long(encrypt['y']), x, long(encrypt['p'])) if self.__keylength == 128: key = hex(key)[2:-1].rjust(32, '0') self.__key = ''.join( (chr(int(key[i * 2:i * 2 + 2], 16)) for i in xrange(16))) else: self.__key = md5.new(str(key)).digest() y = pow(long(encrypt['g']), x, long(encrypt['p'])) self.__post('phprpc_encrypt=%s' % y) else: self.__key = None self.__keyexchanged = True self.__encryptmode = 0 encryptmode = 0 return encryptmode
def __args(self, s, key, encrypt): #return phpformat.dict_to_list(phpformat.unserialize( # self.__decrypt_string(base64.b64decode(s), key, 1, encrypt) #)) if s else [] result = [] if s : result = phpformat.dict_to_list(phpformat.unserialize( self.__decrypt_string(base64.b64decode(s), key, 1, encrypt))) return result
def __args(self, s, key, encrypt): #return phpformat.dict_to_list(phpformat.unserialize( # self.__decrypt_string(base64.b64decode(s), key, 1, encrypt) #)) if s else [] result = [] if s: result = phpformat.dict_to_list( phpformat.unserialize( self.__decrypt_string(base64.b64decode(s), key, 1, encrypt))) return result
def __session(self, session, cid, hash = None): if hash: session[cid] = phpformat.serialize(hash) else: return phpformat.unserialize(session.get(cid, 'a:0:{}'))
def __session(self, session, cid, hash=None): if hash: session[cid] = phpformat.serialize(hash) else: return phpformat.unserialize(session.get(cid, 'a:0:{}'))
def __invoke(self, name, args, byRef, encryptmode): data = {'result': None, 'warning': None, 'output': ''} try: try: if encryptmode == None: encryptmode = self.__encryptmode self.__lock1.acquire() try: encryptmode = self.__key_exchange(encryptmode) finally: self.__lock1.release() result = self.__post( "phprpc_func=%s&phprpc_args=%s&phprpc_encrypt=%s&phprpc_ref=%s" % (name, base64.b64encode( self.__encrypt(phpformat.serialize(args), 1, encryptmode)).replace('+', '%2B'), encryptmode, str(byRef).lower())) if result.has_key('phprpc_errstr') and result.has_key( 'phprpc_errno'): if (int(result['phprpc_errno']) == 0): warning = None else: warning = PHPRPC_Error( int(result['phprpc_errno']), base64.b64decode(result['phprpc_errstr'])) elif result.has_key('phprpc_functions'): warning = PHPRPC_Error( 1, "PHPRPC server haven't received the POST data!") else: warning = PHPRPC_Error( 1, "PHPRPC server occured unknown error!") data['warning'] = warning if result.has_key('phprpc_output'): output = base64.b64decode(result['phprpc_output']) if self.__server_version >= 3: output = self.__decrypt(output, 3, encryptmode) else: output = '' data['output'] = output if result.has_key('phprpc_result'): if result.has_key('phprpc_args'): #arguments = phpformat.unserialize(self.__decrypt(base64.b64decode(result['phprpc_arg']), 1, encryptmode)) arguments = phpformat.unserialize( self.__decrypt( base64.b64decode(result['phprpc_args']), 1, encryptmode)) #for key in arguments: args[key] = arguments[key] if isinstance(args, types.ListType): for key in arguments: args[key] = arguments[key] data['result'] = phpformat.unserialize( self.__decrypt( base64.b64decode(result['phprpc_result']), 2, encryptmode)) else: data['result'] = warning except PHPRPC_Error, e: data['result'] = e except Exception, ex: if ex is types.StringType: data['result'] = PHPRPC_Error(1, ex) else: e = tuple(ex) if (len(e) == 2) and (type(e[0]) is types.IntType) and ( type(e[1]) is types.StringType): data['result'] = PHPRPC_Error(e[0], e[1]) else: data['result'] = PHPRPC_Error(1, str(ex))