Esempio n. 1
0
    def phase_two(self):

        hash = None
        i = -1
        for message in self.phase_two_messages:
            i += 1

            # Sent ANP transport header
            log.debug("Phase 2: sending ANPT header %i, size %i." % ( i, message.size ))
            self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, message.size)
            log.debug("Phase 2: sent ANPT header %i, size %i." % ( i, message.size ))

            # Send base message anp message.

            kanp.send_anpt_msg(self.writer, message.anpm)

            if not hash:
                hash = hashlib.md5()

            j = -1
            for subm in message.sub_messages:
                j += 1
                if isinstance(subm, PhaseTwoChunkSubMessage):
                    # send chunk
                    log.debug("Phase 2: preparing file %i chunk %i anp message." % ( i, j ))
                    bytes = subm.chunk.read()
                    hash.update(bytes)
                    subm.anpm.add_bin(bytes)
                    log.debug("Phase 2: sending file %i chunk %i anp message." % ( i, j ))
                    kanp.send_anpt_msg(self.writer, subm.anpm)
                    log.debug("Phase 2: sent file %i chunk %i anp message." % ( i, j ))

                else:
                    assert isinstance(subm, PhaseTwoCommitSubMessage)
                    # send commit
                    log.debug("Phase 2: preparing file %i commit anp message." % ( i ))
                    bytes = hash.digest()
                    subm.anpm.add_bin(bytes)
                    hash = hashlib.md5()
                    log.debug("Phase 2: sending file %i commit anp message." % ( i ))
                    kanp.send_anpt_msg(self.writer, subm.anpm)
                    log.debug("Phase 2: sent file %i commit anp message." % ( i ))

            # get response
            log.debug("Phase 2: getting %i reply." % ( i ))
            h, m = kanp.get_anpt_all(self.reader)
            log.debug("Phase 2: got %i reply." % ( i ))
            if h.type == kanp.KANP_RES_FAIL:
                raise kanp.KANPFailure(m.get_u32(), m.get_str())
            assert h.type == kanp.KANP_RES_OK

        # get response
        h, m = kanp.get_anpt_all(self.reader)
        log.debug("Phase 2: got final reply.")
        if h.type == kanp.KANP_RES_FAIL:
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK

        log.debug("File upload finished.")
Esempio n. 2
0
    def get_kcd_upload_ticket(self, workspace_id, share_id, user_id, email_id='kwmo'):
        # Connect to KCD.
        self.connect()

        # Select workspace role.
        self.select_role(kanp.KANP_KCD_ROLE_WORKSPACE)

        # Connect to workspace.
        self.connect_workspace(workspace_id = int(workspace_id),
            user_id = user_id, email_id = email_id, password = self.conf.kcd_passwd)

        # Send the command to KCD.
        am = kanp.ANP_msg()
        am.add_u64(workspace_id)
        am.add_u32(share_id)
        payload = am.get_payload()
        self.send_command_header(kanp.KANP_CMD_KFS_UPLOAD_REQ, len(payload))
        self.write(payload)
        log.debug("Sent upload request to KCD for workspace %i, share %i." % ( workspace_id, share_id ) )

        # Get command result.
        h, m = kanp.get_anpt_all(self)

        # Close KCD connection.
        self.close()

        # Handle result.
        if h.type != kanp.KANP_RES_KFS_UPLOAD_REQ:
            log.debug("Got result type '%s'." % ( kanp.get_kanp_constant(h.type, 'KANP_') ) )
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        ticket = m.get_bin()

        return ticket
Esempio n. 3
0
    def connect_workspace(self,
                          workspace_id,
                          last_evt_id=0,
                          last_evt_timestamp=0,
                          user_id=0,
                          real_name='',
                          email_address='',
                          email_id='',
                          ticket='',
                          password='',
                          delete_on_login=0):

        # Create ANP command.
        m = kanp.ANP_msg()
        m.add_u64(workspace_id)
        m.add_u32(delete_on_login)
        m.add_u64(last_evt_id)
        m.add_u64(last_evt_timestamp)
        m.add_u32(user_id)
        m.add_str(real_name)
        m.add_str(email_address)
        m.add_str(email_id)
        m.add_bin(ticket)
        m.add_str(password)

        # Send the command to KCD.
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_KWS_CONNECT_KWS, len(payload))
        log.debug("Sent anp command to connect to workspace %i." %
                  (workspace_id))
        self.write(payload)
        # Get command result.
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_KWS_CONNECT_KWS:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())

        # Decode result.
        result = m.get_u32()
        error = m.get_str()
        user_id = m.get_u32()
        email_id = m.get_str()
        last_evt_id = m.get_u64()
        secure = m.get_u32()
        password_assigned = m.get_u32()
        kwmo_server = m.get_str()
        if result != kanp.KANP_KWS_LOGIN_OK:
            raise kanp.KANPFailure(result, error)

        log.debug("Connected to workspace %i." % (workspace_id))
Esempio n. 4
0
    def select_role(self, role):
        log.debug("select_role() called")

        # send request
        m = kanp.ANP_msg()
        m.add_u32(role)
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_MGT_SELECT_ROLE, len(payload))
        self.write(payload)

        # get response
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_OK:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK
        log.debug("Role %i selected." % (role))
Esempio n. 5
0
    def select_role(self, role):
        log.debug("select_role() called")

        # send request
        m = kanp.ANP_msg()
        m.add_u32(role)
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_MGT_SELECT_ROLE, len(payload))
        self.write(payload)

        # get response
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_OK:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK
        log.debug("Role %i selected." % ( role ))
Esempio n. 6
0
    def get_kcd_upload_ticket(self,
                              workspace_id,
                              share_id,
                              user_id,
                              email_id='kwmo'):
        # Connect to KCD.
        self.connect()

        # Select workspace role.
        self.select_role(kanp.KANP_KCD_ROLE_WORKSPACE)

        # Connect to workspace.
        self.connect_workspace(workspace_id=int(workspace_id),
                               user_id=user_id,
                               email_id=email_id,
                               password=self.conf.kcd_passwd)

        # Send the command to KCD.
        am = kanp.ANP_msg()
        am.add_u64(workspace_id)
        am.add_u32(share_id)
        payload = am.get_payload()
        self.send_command_header(kanp.KANP_CMD_KFS_UPLOAD_REQ, len(payload))
        self.write(payload)
        log.debug("Sent upload request to KCD for workspace %i, share %i." %
                  (workspace_id, share_id))

        # Get command result.
        h, m = kanp.get_anpt_all(self)

        # Close KCD connection.
        self.close()

        # Handle result.
        if h.type != kanp.KANP_RES_KFS_UPLOAD_REQ:
            log.debug("Got result type '%s'." %
                      (kanp.get_kanp_constant(h.type, 'KANP_')))
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        ticket = m.get_bin()

        return ticket
Esempio n. 7
0
    def connect_workspace(self, workspace_id, last_evt_id=0, last_evt_timestamp=0, 
            user_id=0, real_name='', email_address='', email_id='', ticket='', password='',
            delete_on_login=0):

        # Create ANP command.
        m = kanp.ANP_msg()
        m.add_u64(workspace_id)
        m.add_u32(delete_on_login)
        m.add_u64(last_evt_id)
        m.add_u64(last_evt_timestamp)
        m.add_u32(user_id)
        m.add_str(real_name)
        m.add_str(email_address)
        m.add_str(email_id)
        m.add_bin(ticket)
        m.add_str(password)
        
        # Send the command to KCD.
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_KWS_CONNECT_KWS, len(payload))
        log.debug("Sent anp command to connect to workspace %i." % ( workspace_id ) )
        self.write(payload)
        # Get command result.
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_KWS_CONNECT_KWS:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())

        # Decode result.
        result = m.get_u32()
        error = m.get_str()
        user_id = m.get_u32()
        email_id = m.get_str()
        last_evt_id = m.get_u64()
        secure = m.get_u32()
        password_assigned = m.get_u32()
        kwmo_server = m.get_str()
        if result != kanp.KANP_KWS_LOGIN_OK:
            raise kanp.KANPFailure(result, error)

        log.debug("Connected to workspace %i." % ( workspace_id ) )
Esempio n. 8
0
    def send_invitation(self, workspace_id, message, invitees):
        # Create command.
        m = kanp.ANP_msg()
        m.add_u64(workspace_id)
        m.add_str(message)
        m.add_u32(len(invitees))
        for invitee in invitees:
            m.add_str(invitee.real_name)
            m.add_str(invitee.email_address)
            m.add_u64(invitee.key_id)
            m.add_str(invitee.org_name)
            m.add_str(invitee.password)
            m.add_u32(int(invitee.send_mail))

        # Send the command to KCD.
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_KWS_INVITE_KWS, len(payload))
        log.debug("Sent anp invite command for workspace %i." % (workspace_id))
        self.write(payload)

        # Get command result.
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_KWS_INVITE_KWS:
            log.debug("Received type '%s'." % (str(h.type)))
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())

        # Decode the result.
        ws_url = m.get_str()
        invitees_nb = m.get_u32()
        for i in range(0, invitees_nb):
            invitees[i].email_id = m.get_str()
            invitees[i].url = m.get_str()
            invitees[i].error = m.get_str()

        return ws_url, invitees
Esempio n. 9
0
    def phase_2_send_message_with_one_submessage(self, subm):

        # Prepare ANP message.
        message = PhaseTwoMessage()
        message.anpm = kanp.ANP_msg()
        message.anpm.add_u32(1) # Send only one sub-message

        # Calculate base messasge size.
        message.size = message.anpm.get_payload_size()
        #log.debug("Base message size: %i bytes." % ( message.size ))

        # Calculate total sub-message size.
        subm.size = subm.anpm.get_payload_size()
        log.debug("Chunk sub-message size: %i bytes." % ( subm.size ))

        total_size = message.size + subm.size

        # Sent ANP transport header
        #log.debug("Phase 2: sending ANPT header with data size %i." % ( total_size ))
        self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, total_size)
        #log.debug("Phase 2: sent ANPT header, size %i." % ( total_size ))

        # Send base message.
        kanp.send_anpt_msg(self.writer, message.anpm)

        # Send sub-message.
        kanp.send_anpt_msg(self.writer, subm.anpm)

        # get response
        #log.debug("Phase 2: getting reply.")
        h, m = kanp.get_anpt_all(self.reader)
        #log.debug("ANP RESPONSE DUMP: %s" % (str(m.dump())))
        #log.debug("Phase 2: got reply.")
        if h.type == kanp.KANP_RES_FAIL:
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK
Esempio n. 10
0
    def send_invitation(self, workspace_id, message, invitees):
        # Create command.
        m = kanp.ANP_msg()
        m.add_u64(workspace_id)
        m.add_str(message)
        m.add_u32(len(invitees))
        for invitee in invitees:
            m.add_str(invitee.real_name)
            m.add_str(invitee.email_address)
            m.add_u64(invitee.key_id)
            m.add_str(invitee.org_name)
            m.add_str(invitee.password)
            m.add_u32(int(invitee.send_mail))

        # Send the command to KCD.
        payload = m.get_payload()
        self.send_command_header(kanp.KANP_CMD_KWS_INVITE_KWS, len(payload))
        log.debug("Sent anp invite command for workspace %i." % ( workspace_id ) )
        self.write(payload)
        
        # Get command result.
        h, m = kanp.get_anpt_all(self)
        if h.type != kanp.KANP_RES_KWS_INVITE_KWS:
            log.debug("Received type '%s'." % ( str(h.type) ) )
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())

        # Decode the result.
        ws_url = m.get_str()
        invitees_nb = m.get_u32()
        for i in range(0, invitees_nb):
            invitees[i].email_id = m.get_str()
            invitees[i].url = m.get_str()
            invitees[i].error = m.get_str()

        return ws_url, invitees
Esempio n. 11
0
    def phase_2_send_message_with_one_submessage(self, subm):

        # Prepare ANP message.
        message = PhaseTwoMessage()
        message.anpm = kanp.ANP_msg()
        message.anpm.add_u32(1)  # Send only one sub-message

        # Calculate base messasge size.
        message.size = message.anpm.get_payload_size()
        #log.debug("Base message size: %i bytes." % ( message.size ))

        # Calculate total sub-message size.
        subm.size = subm.anpm.get_payload_size()
        log.debug("Chunk sub-message size: %i bytes." % (subm.size))

        total_size = message.size + subm.size

        # Sent ANP transport header
        #log.debug("Phase 2: sending ANPT header with data size %i." % ( total_size ))
        self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, total_size)
        #log.debug("Phase 2: sent ANPT header, size %i." % ( total_size ))

        # Send base message.
        kanp.send_anpt_msg(self.writer, message.anpm)

        # Send sub-message.
        kanp.send_anpt_msg(self.writer, subm.anpm)

        # get response
        #log.debug("Phase 2: getting reply.")
        h, m = kanp.get_anpt_all(self.reader)
        #log.debug("ANP RESPONSE DUMP: %s" % (str(m.dump())))
        #log.debug("Phase 2: got reply.")
        if h.type == kanp.KANP_RES_FAIL:
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK
Esempio n. 12
0
    def phase_one(self, email_id, ticket):

        # Prepare phase one ANP message.
        m = kanp.ANP_msg()
        m.add_bin(ticket)
        m.add_u64(email_id)
        m.add_u32(len(self.kfs_entries))
        for kfs_entry in self.kfs_entries:
            if kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_FILE:
                m.add_u32(5) # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.parent_inode_id)
                m.add_u64(kfs_entry.parent_commit_id)
                m.add_str(kfs_entry.name)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_UPDATE_FILE:
                m.add_u32(4) # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode)
                m.add_u64(kfs_entry.commit_id)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_DIR:
                m.add_u32(5) # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.parent_inode_id)
                m.add_u64(kfs_entry.parent_commit_id)
                m.add_str(kfs_entry.name)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_DIR:
                m.add_u32(4) # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode_id)
                m.add_u64(kfs_entry.commit_id)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_FILE:
                m.add_u32(4) # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode_id)
                m.add_u64(kfs_entry.commit_id)

            else:
                raise Exception("Unexpected KFS operation: '%s'." % ( str(kfs_entry.kfs_op) ) )

        # Send phase one ANP message to KCD.
        payload = m.get_payload()
        self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_1, len(payload))
        self.writer.write(payload)
        log.debug("Phase 1 data sent.")

        # Get phase one result.
        h, m = kanp.get_anpt_all(self.reader)
        if h.type != kanp.KANP_RES_KFS_PHASE_1:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        log.debug("Got phase 1 reply.")

        # Handle phase one reply.
        phase_two_needed = False
        commit_id = m.get_u64()
        nb_op = m.get_u32()
        assert nb_op == len(self.kfs_entries)
        for i in range(0, nb_op):
            errno = m.get_u32()
            error = m.get_str()
            if error:
                log.debug(
                    "Phase 1: KFS operation %i error: errno=%i, error='%s'" % \
                    ( i, errno, error ))
                self.kfs_entries[i].kfs_error = error
Esempio n. 13
0
    def phase_two(self):

        hash = None
        i = -1
        for message in self.phase_two_messages:
            i += 1

            # Sent ANP transport header
            log.debug("Phase 2: sending ANPT header %i, size %i." %
                      (i, message.size))
            self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2,
                                            message.size)
            log.debug("Phase 2: sent ANPT header %i, size %i." %
                      (i, message.size))

            # Send base message anp message.

            kanp.send_anpt_msg(self.writer, message.anpm)

            if not hash:
                hash = hashlib.md5()

            j = -1
            for subm in message.sub_messages:
                j += 1
                if isinstance(subm, PhaseTwoChunkSubMessage):
                    # send chunk
                    log.debug(
                        "Phase 2: preparing file %i chunk %i anp message." %
                        (i, j))
                    bytes = subm.chunk.read()
                    hash.update(bytes)
                    subm.anpm.add_bin(bytes)
                    log.debug(
                        "Phase 2: sending file %i chunk %i anp message." %
                        (i, j))
                    kanp.send_anpt_msg(self.writer, subm.anpm)
                    log.debug("Phase 2: sent file %i chunk %i anp message." %
                              (i, j))

                else:
                    assert isinstance(subm, PhaseTwoCommitSubMessage)
                    # send commit
                    log.debug(
                        "Phase 2: preparing file %i commit anp message." % (i))
                    bytes = hash.digest()
                    subm.anpm.add_bin(bytes)
                    hash = hashlib.md5()
                    log.debug("Phase 2: sending file %i commit anp message." %
                              (i))
                    kanp.send_anpt_msg(self.writer, subm.anpm)
                    log.debug("Phase 2: sent file %i commit anp message." %
                              (i))

            # get response
            log.debug("Phase 2: getting %i reply." % (i))
            h, m = kanp.get_anpt_all(self.reader)
            log.debug("Phase 2: got %i reply." % (i))
            if h.type == kanp.KANP_RES_FAIL:
                raise kanp.KANPFailure(m.get_u32(), m.get_str())
            assert h.type == kanp.KANP_RES_OK

        # get response
        h, m = kanp.get_anpt_all(self.reader)
        log.debug("Phase 2: got final reply.")
        if h.type == kanp.KANP_RES_FAIL:
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        assert h.type == kanp.KANP_RES_OK

        log.debug("File upload finished.")
Esempio n. 14
0
    def phase_one(self, email_id, ticket):

        # Prepare phase one ANP message.
        m = kanp.ANP_msg()
        m.add_bin(ticket)
        m.add_u64(email_id)
        m.add_u32(len(self.kfs_entries))
        for kfs_entry in self.kfs_entries:
            if kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_FILE:
                m.add_u32(5)  # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.parent_inode_id)
                m.add_u64(kfs_entry.parent_commit_id)
                m.add_str(kfs_entry.name)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_UPDATE_FILE:
                m.add_u32(4)  # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode)
                m.add_u64(kfs_entry.commit_id)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_DIR:
                m.add_u32(5)  # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.parent_inode_id)
                m.add_u64(kfs_entry.parent_commit_id)
                m.add_str(kfs_entry.name)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_DIR:
                m.add_u32(4)  # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode_id)
                m.add_u64(kfs_entry.commit_id)

            elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_FILE:
                m.add_u32(4)  # nb of elements
                m.add_u32(kfs_entry.kfs_op)
                m.add_u64(kfs_entry.inode_id)
                m.add_u64(kfs_entry.commit_id)

            else:
                raise Exception("Unexpected KFS operation: '%s'." %
                                (str(kfs_entry.kfs_op)))

        # Send phase one ANP message to KCD.
        payload = m.get_payload()
        self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_1,
                                        len(payload))
        self.writer.write(payload)
        log.debug("Phase 1 data sent.")

        # Get phase one result.
        h, m = kanp.get_anpt_all(self.reader)
        if h.type != kanp.KANP_RES_KFS_PHASE_1:
            assert h.type == kanp.KANP_RES_FAIL
            raise kanp.KANPFailure(m.get_u32(), m.get_str())
        log.debug("Got phase 1 reply.")

        # Handle phase one reply.
        phase_two_needed = False
        commit_id = m.get_u64()
        nb_op = m.get_u32()
        assert nb_op == len(self.kfs_entries)
        for i in range(0, nb_op):
            errno = m.get_u32()
            error = m.get_str()
            if error:
                log.debug(
                    "Phase 1: KFS operation %i error: errno=%i, error='%s'" % \
                    ( i, errno, error ))
                self.kfs_entries[i].kfs_error = error