Exemplo n.º 1
0
 def _f(t):
     if len(t) > 0:
         tar = int(t[:2])
         length = int(t[2: 13])
         value = t[13:13 + length]
         if settings.DEBUG: print 'tlv:', tar, length, value
         return ''.join([int2hex(tar, int_len=2), int2hex(length, int_len=2), value, _f(t[13+length :])])
     return ''
Exemplo n.º 2
0
 def _f(t):
     if len(t) > 0:
         tar = int(t[:2])
         length = int(t[2:13])
         value = t[13:13 + length]
         if settings.DEBUG: print 'tlv:', tar, length, value
         return ''.join([
             int2hex(tar, int_len=2),
             int2hex(length, int_len=2), value,
             _f(t[13 + length:])
         ])
     return ''
Exemplo n.º 3
0
    def handle_upload(self, content):
        # print 'handle upload', content
        # 检查文件hash
        m = hashlib.md5()
        m.update(content)
        if m.digest() != self.file_hash:
            raise FileHashError()

        file_name = self.make_return_file_name(self._save_file(content))

        # 返回结果TLV
        result = ''
        result += int2hex(RETURN_TAG_FILENAME, int_len=2)
        result += int2hex(len(file_name), int_len=2)
        result += file_name
        return result
Exemplo n.º 4
0
    def handle_upload(self, content):
        # print 'handle upload', content
        # 检查文件hash
        m = hashlib.md5()
        m.update(content)
        if m.digest() != self.file_hash:
            raise FileHashError()

        file_name = self.make_return_file_name(self._save_file(content))

        # 返回结果TLV
        result = ""
        result += int2hex(RETURN_TAG_FILENAME, int_len=2)
        result += int2hex(len(file_name), int_len=2)
        result += file_name
        return result
Exemplo n.º 5
0
def do_upload(socket, remote_address):
    # print remote_address
    socket._status = SOCKET_STATUS_WAITING # 标记链接状态
    
    error_code = ''
    fileobj = FileObjWrapper(socket.makefile())
    # 读取上传请求
    try:
        request_head = fileobj.read(26)
        # print 'request head', repr(request_head)
        packet_length = hex2int(request_head[:4]) # 第一次参数接受、解析出错,就不理会
    except:
        try:
            fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2))
            fileobj.close()
        except:
            pass
        return
    
    socket._status = SOCKET_STATUS_WORKING # 标记链接状态
    
    app_id = hex2int(request_head[4:6], int_len=2)
    file_size = hex2int(request_head[6:10])
    file_hash = request_head[10:26]
    
    try:
        handler = get_app_handler(app_id, file_size, file_hash)
    except FileSizeError:
        fileobj.write(int2hex(RESULT_FILE_TOO_LARGE, int_len=2))
        fileobj.close()
        return
    except Exception:
        log.error(traceback.format_exc())
        fileobj.write(int2hex(RESULT_FS_ERROR, int_len=2))
        fileobj.close()
        return
        
    if not handler: # 找不到授权应用
        fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2))
        fileobj.close()
        return
    
    socket.timeout = handler.CONNECTION_TIMEOUT # 设置线程总超时时长,秒
    
    # 读取请求TLV参数
    tlv = fileobj.read(packet_length - 26)
    try:
        handler.handle_request(tlv)
    except InvalidArgsError:
        error_code = RESULT_INVALID_ARGS
    except AuthenticateError:
        error_code = RESULT_AUTH_FAIL
    except FileTypeError:
        error_code = RESULT_WRONG_FILE_TYPE
    except FileExistError, e:
        fileobj.write(int2hex(RESULT_FILE_EXIST, int_len=2))
        fileobj.write(int2hex(4 + len(e.message))) # 4个字节是这个长度值本身长度
        fileobj.write(e.message)
        fileobj.close()
        return
Exemplo n.º 6
0
def do_upload(socket, remote_address):
    # print remote_address
    socket._status = SOCKET_STATUS_WAITING  # 标记链接状态

    error_code = ''
    fileobj = FileObjWrapper(socket.makefile())
    # 读取上传请求
    try:
        request_head = fileobj.read(26)
        # print 'request head', repr(request_head)
        packet_length = hex2int(request_head[:4])  # 第一次参数接受、解析出错,就不理会
    except:
        try:
            fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2))
            fileobj.close()
        except:
            pass
        return

    socket._status = SOCKET_STATUS_WORKING  # 标记链接状态

    app_id = hex2int(request_head[4:6], int_len=2)
    file_size = hex2int(request_head[6:10])
    file_hash = request_head[10:26]

    try:
        handler = get_app_handler(app_id, file_size, file_hash)
    except FileSizeError:
        fileobj.write(int2hex(RESULT_FILE_TOO_LARGE, int_len=2))
        fileobj.close()
        return
    except Exception:
        log.error(traceback.format_exc())
        fileobj.write(int2hex(RESULT_FS_ERROR, int_len=2))
        fileobj.close()
        return

    if not handler:  # 找不到授权应用
        fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2))
        fileobj.close()
        return

    socket.timeout = handler.CONNECTION_TIMEOUT  # 设置线程总超时时长,秒

    # 读取请求TLV参数
    tlv = fileobj.read(packet_length - 26)
    try:
        handler.handle_request(tlv)
    except InvalidArgsError:
        error_code = RESULT_INVALID_ARGS
    except AuthenticateError:
        error_code = RESULT_AUTH_FAIL
    except FileTypeError:
        error_code = RESULT_WRONG_FILE_TYPE
    except FileExistError, e:
        fileobj.write(int2hex(RESULT_FILE_EXIST, int_len=2))
        fileobj.write(int2hex(4 + len(e.message)))  # 4个字节是这个长度值本身长度
        fileobj.write(e.message)
        fileobj.close()
        return
Exemplo n.º 7
0
    def handle_request(self, tlv):
        # print 'handle request', tlv
        self._parse_request_args(tlv)
        # 解析请求参数

        if not self.session_id:
            # 检查请求参数是否存在错误
            raise InvalidArgsError()

        if not self.check_session():
            # 检查session
            raise AuthenticateError()

        self._check_file_extension()

        self.check_request(tlv)

        exist_file = self._check_file_exist()
        if exist_file:
            result = ''
            result += int2hex(10, int_len=2)
            result += int2hex(len(exist_file), int_len=2)
            result += exist_file
            raise FileExistError(result)
Exemplo n.º 8
0
    def handle_request(self, tlv):
        # print 'handle request', tlv
        self._parse_request_args(tlv)
        # 解析请求参数

        if not self.session_id:
            # 检查请求参数是否存在错误
            raise InvalidArgsError()

        if not self.check_session():
            # 检查session
            raise AuthenticateError()

        self._check_file_extension()

        self.check_request(tlv)

        exist_file = self._check_file_exist()
        if exist_file:
            result = ""
            result += int2hex(10, int_len=2)
            result += int2hex(len(exist_file), int_len=2)
            result += exist_file
            raise FileExistError(result)
Exemplo n.º 9
0
    except AuthenticateError:
        error_code = RESULT_AUTH_FAIL
    except FileTypeError:
        error_code = RESULT_WRONG_FILE_TYPE
    except FileExistError, e:
        fileobj.write(int2hex(RESULT_FILE_EXIST, int_len=2))
        fileobj.write(int2hex(4 + len(e.message))) # 4个字节是这个长度值本身长度
        fileobj.write(e.message)
        fileobj.close()
        return
    except Exception:
        log.error(traceback.format_exc())
        error_code = RESULT_FS_ERROR
        
    if error_code:
        fileobj.write(int2hex(error_code, int_len=2))
        fileobj.close()
        return

    # 返回允许上传标志
    fileobj.write(int2hex(RESULT_ALLOW_UPLOAD, int_len=2))
    fileobj.flush()
    # print 'write request result', RESULT_ALLOW_UPLOAD

    # 读取文件内容
    content = fileobj.read(file_size)
    if len(content) > handler.FILE_MAX_SIZE:
        error_code = RESULT_FILE_TOO_LARGE
    try:
        # 执行文件处理程序
        result_tlv = handler.handle_upload(content)
Exemplo n.º 10
0
    except AuthenticateError:
        error_code = RESULT_AUTH_FAIL
    except FileTypeError:
        error_code = RESULT_WRONG_FILE_TYPE
    except FileExistError, e:
        fileobj.write(int2hex(RESULT_FILE_EXIST, int_len=2))
        fileobj.write(int2hex(4 + len(e.message)))  # 4个字节是这个长度值本身长度
        fileobj.write(e.message)
        fileobj.close()
        return
    except Exception:
        log.error(traceback.format_exc())
        error_code = RESULT_FS_ERROR

    if error_code:
        fileobj.write(int2hex(error_code, int_len=2))
        fileobj.close()
        return

    # 返回允许上传标志
    fileobj.write(int2hex(RESULT_ALLOW_UPLOAD, int_len=2))
    fileobj.flush()
    # print 'write request result', RESULT_ALLOW_UPLOAD

    # 读取文件内容
    content = fileobj.read(file_size)
    if len(content) > handler.FILE_MAX_SIZE:
        error_code = RESULT_FILE_TOO_LARGE
    try:
        # 执行文件处理程序
        result_tlv = handler.handle_upload(content)
Exemplo n.º 11
0
def push_file(app_id, filename, session_id, server_ip, server_port):
    print 'put file to : %s:%s' %(server_ip, server_port)
    f = open(filename, 'r')
    content = f.read()
    f.close()
    
    m = hashlib.md5()
    m.update(content)
    file_hash = m.digest()
    file_size = len(content)
    file_name = f.name
    
    request = ''
    request += int2hex(26 + 4 * 2 + len(session_id) + len(file_name))
    request += int2hex(app_id, int_len=2)
    request += int2hex(file_size)
    request += file_hash
    request += int2hex(1, int_len=2)
    request += int2hex(len(session_id), int_len=2)
    request += session_id
    request += int2hex(2, int_len=2)
    request += int2hex(len(file_name), int_len=2)
    request += file_name
    
    s = open_conn(server_ip, server_port)
    
    time.sleep(1) ##################################################### 测试链接超时性
    
    s.sendall(request)
    response = s.recv(2) # 请求结果2个字节
    result = hex2int(response, int_len=2)
    if result == RESULT_ALLOW_UPLOAD:
        
        time.sleep(1) ################################################## 测试链接超时性
        print "let's pushing ..."
        
        p = int(file_size / 10)
        sum_ = 0
        for _k in range(1, 10):
            c_ = content[p*(_k-1): p*_k]
            sum_ += len(c_)
            print '  %d%% [%d/%d] ...' %(_k * 10, sum_, file_size)
            
            time.sleep(1) ############################################### 测试链接超时性
            
            s.sendall(c_)
        print ' %d%% [%d/%d] ...' %((_k + 1) * 10, sum_ + len(content[p*_k: ]), file_size)
        s.sendall(content[p*_k: ])
        try:
            upload_response = s.recv(6) # 这6个字节分别为:4个字节的包长度,2个字节的上传结果
            # 正常上传结果
            packet_len = hex2int(upload_response[:4])
            result = hex2int(upload_response[4:6], int_len=2)
        except:
            result = hex2int(upload_response[:2], int_len=2) # 上传过程中发生异常,则只有2字节
        if result == RESULT_UPLOAD_SUCCESS:
            tlv = s.recv(packet_len - 6)
            pos = 0
            f_url = None
            while pos < len(tlv):
                tag = hex2int(tlv[pos:pos+2], int_len=2)
                if not tag:
                    break
                length = hex2int(tlv[pos+2:pos+4], int_len=2)
                value = tlv[pos+4:pos+4+length]
                pos += 4 + length
                if tag == 10: # 文件路径tag
                    f_url = value
                else:
                    print 'unknow tag:::::::::', tag
                    break
            print 'f_url::::::::::::', f_url
            
        else:
            print 'upload error::::', result
    else:
        if result == RESULT_FILE_EXIST: # 文件已经存在
            print 'file exist!!'
            pak_len = hex2int(s.recv(4)) - 4
            pak = s.recv(pak_len)
            p = 0
            f_url = None
            while p < pak_len:
                t = hex2int(pak[p:p+2], int_len=2)
                # print "tag::", t
                if not t:
                    break
                
                length = hex2int(pak[p+2:p+4], int_len=2)
                # print 'len::', length
                value = pak[p+4:p+4+length]
                # print 'value::', value
                p += 4 + length
                if t == 10: # 文件路径tag
                    f_url = value
                else:
                    print 'unknow tag:::::::::', t
                    break
            print 'f_url::::::::::::', f_url
        else:
            print 'upload error::::',
            if result == RESULT_WRONG_FILE_TYPE:
                print u'不允许的文件类型'
            elif result == RESULT_INVALID_ARGS:
                print u'参数无效'
            elif result == RESULT_FILE_TOO_LARGE:
                print u'文件太大'
            elif result == RESULT_AUTH_FAIL:
                print u'认证错误'
            elif result == RESULT_BUSY:
                print u'系统繁忙'
            elif result == RESULT_FS_ERROR:
                print u'文件系统异常'
            else:
                print u'未知错误[%s]' %result
    s.close()
Exemplo n.º 12
0
def push_file(app_id, filename, session_id, server_ip, server_port):
    print 'put file to : %s:%s' % (server_ip, server_port)
    f = open(filename, 'r')
    content = f.read()
    f.close()

    m = hashlib.md5()
    m.update(content)
    file_hash = m.digest()
    file_size = len(content)
    file_name = f.name

    request = ''
    request += int2hex(26 + 4 * 2 + len(session_id) + len(file_name))
    request += int2hex(app_id, int_len=2)
    request += int2hex(file_size)
    request += file_hash
    request += int2hex(1, int_len=2)
    request += int2hex(len(session_id), int_len=2)
    request += session_id
    request += int2hex(2, int_len=2)
    request += int2hex(len(file_name), int_len=2)
    request += file_name

    s = open_conn(server_ip, server_port)

    time.sleep(
        1)  ##################################################### 测试链接超时性

    s.sendall(request)
    response = s.recv(2)  # 请求结果2个字节
    result = hex2int(response, int_len=2)
    if result == RESULT_ALLOW_UPLOAD:

        time.sleep(
            1)  ################################################## 测试链接超时性
        print "let's pushing ..."

        p = int(file_size / 10)
        sum_ = 0
        for _k in range(1, 10):
            c_ = content[p * (_k - 1):p * _k]
            sum_ += len(c_)
            print '  %d%% [%d/%d] ...' % (_k * 10, sum_, file_size)

            time.sleep(
                1)  ############################################### 测试链接超时性

            s.sendall(c_)
        print ' %d%% [%d/%d] ...' % (
            (_k + 1) * 10, sum_ + len(content[p * _k:]), file_size)
        s.sendall(content[p * _k:])
        try:
            upload_response = s.recv(6)  # 这6个字节分别为:4个字节的包长度,2个字节的上传结果
            # 正常上传结果
            packet_len = hex2int(upload_response[:4])
            result = hex2int(upload_response[4:6], int_len=2)
        except:
            result = hex2int(upload_response[:2],
                             int_len=2)  # 上传过程中发生异常,则只有2字节
        if result == RESULT_UPLOAD_SUCCESS:
            tlv = s.recv(packet_len - 6)
            pos = 0
            f_url = None
            while pos < len(tlv):
                tag = hex2int(tlv[pos:pos + 2], int_len=2)
                if not tag:
                    break
                length = hex2int(tlv[pos + 2:pos + 4], int_len=2)
                value = tlv[pos + 4:pos + 4 + length]
                pos += 4 + length
                if tag == 10:  # 文件路径tag
                    f_url = value
                else:
                    print 'unknow tag:::::::::', tag
                    break
            print 'f_url::::::::::::', f_url

        else:
            print 'upload error::::', result
    else:
        if result == RESULT_FILE_EXIST:  # 文件已经存在
            print 'file exist!!'
            pak_len = hex2int(s.recv(4)) - 4
            pak = s.recv(pak_len)
            p = 0
            f_url = None
            while p < pak_len:
                t = hex2int(pak[p:p + 2], int_len=2)
                # print "tag::", t
                if not t:
                    break

                length = hex2int(pak[p + 2:p + 4], int_len=2)
                # print 'len::', length
                value = pak[p + 4:p + 4 + length]
                # print 'value::', value
                p += 4 + length
                if t == 10:  # 文件路径tag
                    f_url = value
                else:
                    print 'unknow tag:::::::::', t
                    break
            print 'f_url::::::::::::', f_url
        else:
            print 'upload error::::',
            if result == RESULT_WRONG_FILE_TYPE:
                print u'不允许的文件类型'
            elif result == RESULT_INVALID_ARGS:
                print u'参数无效'
            elif result == RESULT_FILE_TOO_LARGE:
                print u'文件太大'
            elif result == RESULT_AUTH_FAIL:
                print u'认证错误'
            elif result == RESULT_BUSY:
                print u'系统繁忙'
            elif result == RESULT_FS_ERROR:
                print u'文件系统异常'
            else:
                print u'未知错误[%s]' % result
    s.close()