Пример #1
0
    def seller_send_request_stream(self, order_info):
        logger.debug("seller send request to proxy ...")
        order_id = list(order_info.keys())[0]
        new_order_info = order_info[order_id]
        market_hash = new_order_info[0]
        seller_addr = eth_addr_to_string(new_order_info[3])
        buyer_addr = eth_addr_to_string(new_order_info[2])
        buyer_rsa_public_key = new_order_info[1]
        proxy_id = eth_addr_to_string(new_order_info[4])
        session = get_session()
        raw_aes_key = session.query(FileInfo.aes_key) \
            .filter(FileInfo.market_hash == Encoder.bytes_to_base64_str(market_hash)) \
            .all()[0][0]
        logger.debug("start to encrypt aes key with buyer rsa public key")
        logger.debug("raw aes key: %s", raw_aes_key)
        logger.debug("buyer rsa public key: %s", buyer_rsa_public_key)
        encrypted_aes_key = load_der_public_key(
            buyer_rsa_public_key, backend=default_backend()).encrypt(
                raw_aes_key,
                padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                             algorithm=hashes.SHA256(),
                             label=None))
        logger.debug("encrypted aes key: %s", encrypted_aes_key)
        logger.debug("order info got generated")
        message = Message()
        seller_data = message.seller_data
        message.type = Message.SELLER_DATA
        seller_data.order_id = order_id
        seller_data.order_type = 'stream'
        seller_data.seller_addr = seller_addr
        seller_data.buyer_addr = buyer_addr
        seller_data.market_hash = Encoder.bytes_to_base64_str(market_hash)
        seller_data.AES_key = encrypted_aes_key
        storage = seller_data.storage

        storage_type = session.query(FileInfo.remote_type) \
            .filter(FileInfo.market_hash == Encoder.bytes_to_base64_str(market_hash)) \
            .all()[0][0]
        remote_uri = session.query(FileInfo.remote_uri) \
            .filter(FileInfo.market_hash == Encoder.bytes_to_base64_str(market_hash)) \
            .all()[0][0]
        storage.type = storage_type
        storage.path = remote_uri

        sign_message = SignMessage()
        sign_message.public_key = self.wallet.market_client.public_key
        sign_message.data = message.SerializeToString()
        sign_message.signature = ECCipher.create_signature(
            self.wallet.market_client.account.private_key, sign_message.data)
        try:
            error, AES_key, urls = yield start_proxy_request(
                sign_message, proxy_id)
            if error:
                logger.error(error)
            else:
                logger.debug(AES_key)
                logger.debug(urls)
                event.emit(events.SELLER_DELIVERY, order_id)
        except Exception as e:
            logger.error(e)
Пример #2
0
 def add_bought_order(order_id):
     logger.debug("start to update local database")
     new_buyer_file_info = BuyerFileInfo(order_id=order_id,
                                         market_hash=Encoder.bytes_to_base64_str(desc_hash),
                                         file_title=file_title, is_downloaded=False)
     add_file(new_buyer_file_info)
     logger.debug("update local db completed")
     event.emit(events.PAY, (order_id, msg_hash))
Пример #3
0
    def buyer_send_request(self, order_info):
        logger.debug("buyer send request to proxy ...")
        order_id = list(order_info.keys())[0]
        new_order_info = order_info[order_id]
        seller_addr = eth_addr_to_string(new_order_info[3])
        buyer_addr = eth_addr_to_string(new_order_info[2])
        proxy_id = eth_addr_to_string(new_order_info[4])
        message = Message()
        buyer_data = message.buyer_data
        message.type = Message.BUYER_DATA
        buyer_data.order_id = order_id
        buyer_data.order_type = 'file'
        buyer_data.seller_addr = seller_addr
        buyer_data.buyer_addr = buyer_addr
        buyer_data.market_hash = Encoder.bytes_to_base64_str(new_order_info[0])

        sign_message = SignMessage()
        sign_message.public_key = self.wallet.market_client.public_key
        sign_message.data = message.SerializeToString()
        sign_message.signature = ECCipher.create_signature(
            self.wallet.market_client.account.private_key, sign_message.data)
        error, AES_key, urls = yield start_proxy_request(
            sign_message, proxy_id)

        def update_buyer_db(file_uri, file_path):
            market_hash = Encoder.bytes_to_base64_str(new_order_info[0])
            file_uuid = file_uri.split('/')[3]
            session = get_session()
            session.query(BuyerFileInfo).filter(
                BuyerFileInfo.order_id == order_id).update(
                    {
                        BuyerFileInfo.market_hash: market_hash,
                        BuyerFileInfo.is_downloaded: True,
                        BuyerFileInfo.file_uuid: file_uuid,
                        BuyerFileInfo.path: file_path,
                        BuyerFileInfo.size: os.path.getsize(file_path)
                    },
                    synchronize_session=False)
            session.commit()

        if error:
            logger.error(error)
        else:
            file_name = urls[0].split('/')[3]
            file_dir = join_with_rc(config.wallet.download_dir)
            # create if not exists
            os.makedirs(file_dir, exist_ok=True)
            file_path = os.path.join(file_dir, file_name)
            yield download_proxy_file(urls[0], file_path)
            logger.debug("downloaded file path: %s", file_path)
            decrypted_file = decrypt_file_aes(file_path, AES_key)
            logger.debug('Decrypted file path: %s', str(decrypted_file))

            update_buyer_db(urls[0], decrypted_file)
            logger.debug("file has been downloaded")
            logger.debug("put order into confirmed queue, order id: %s",
                         order_id)
        event.emit(events.BUYER_RECEIVE, order_id)
Пример #4
0
def valid_password(password):
    path = os.path.expanduser('~/.cpchain')
    with shelve.open(os.path.join(path, 'account')) as file:
        key_path = file.get('key_path')
        with open(key_path) as f:
            encrypted_key = json.load(f)
        try:
            web3.eth.account.decrypt(encrypted_key, password)
            return True
        except ValueError as e:
            logger.exception(e)
            event.emit(events.PASSWORD_ERROR)
            return False
Пример #5
0
    def buyer_send_request_stream(self, order_info):
        logger.debug("buyer send request to proxy ...")
        order_id = list(order_info.keys())[0]
        new_order_info = order_info[order_id]
        seller_addr = eth_addr_to_string(new_order_info[3])
        buyer_addr = eth_addr_to_string(new_order_info[2])
        proxy_id = eth_addr_to_string(new_order_info[4])
        message = Message()
        buyer_data = message.buyer_data
        message.type = Message.BUYER_DATA
        buyer_data.order_id = order_id
        buyer_data.order_type = 'stream'
        buyer_data.seller_addr = seller_addr
        buyer_data.buyer_addr = buyer_addr
        buyer_data.market_hash = Encoder.bytes_to_base64_str(new_order_info[0])

        sign_message = SignMessage()
        sign_message.public_key = self.wallet.market_client.public_key
        sign_message.data = message.SerializeToString()
        sign_message.signature = ECCipher.create_signature(
            self.wallet.market_client.account.private_key, sign_message.data)

        error, AES_key, urls = yield start_proxy_request(
            sign_message, proxy_id)

        def update_buyer_db(stream_id):
            session = get_session()
            session.query(BuyerFileInfo).filter(
                BuyerFileInfo.order_id == order_id).update(
                    {
                        BuyerFileInfo.is_downloaded: True,
                        BuyerFileInfo.path: stream_id,
                    },
                    synchronize_session=False)
            session.commit()

        if error:
            logger.error(error)
        else:
            update_buyer_db(json.dumps(urls))
            logger.debug("Stream data has been geted")
        event.emit(events.BUYER_RECEIVE, order_id)
Пример #6
0
def import_account(key_file, passwd):

    with open(key_file) as f:
        encrypted_key = json.load(f)

    try:
        private_key = web3.eth.account.decrypt(encrypted_key, passwd)
        acct = web3.eth.account.privateKeyToAccount(private_key)
    except ValueError as e:
        logger.exception(e)
        event.emit(events.PASSWORD_ERROR)
        return None

    try:
        web3.personal.importRawKey(acct.privateKey, passwd)
    except:
        logger.info("account already in node's keychain")

    account = Account(key_passphrase=passwd, private_key=acct.privateKey)
    account.key_path = key_file
    return account
Пример #7
0
def __login(account=None):
    if account is None:
        wallet.accounts.set_default_account(1)
        account = wallet.accounts.default_account
    public_key = ECCipher.serialize_public_key(account.public_key)
    addr = utils.get_address_from_public_key_object(public_key)
    addr = web3.toChecksumAddress(addr)
    app.addr = addr
    if isinstance(account.key_passphrase, str):
        app.pwd = account.key_passphrase
    else:
        app.pwd = account.key_passphrase.decode()
    wallet.market_client.account = account
    wallet.market_client.public_key = ECCipher.serialize_public_key(
        wallet.market_client.account.public_key)
    wallet.market_client.login(app.username).addCallbacks(
        lambda _: event.emit(events.LOGIN_COMPLETED))
    wallet.init()
    initialize_system()
    app.router.redirectTo('market_page')