Exemplo n.º 1
0
def site_file(name: str, file: str)->Response:
    """Accept a site 'name', if pubkey then show multi-page site, if hash show single page site"""
    resp: str = 'Not Found'
    mime_type = mimetypes.MimeTypes().guess_type(file)[0]

    # If necessary convert the name to base32 from mnemonic
    if mnemonickeys.DELIMITER in name:
        name = mnemonickeys.get_base32(name)

    # Now make sure the key is regardless a valid base32 format ed25519 key (readding padding if necessary)
    if stringvalidators.validate_pub_key(name):
        name = unpaddedbase32.repad(name)
        resp = sitefiles.get_file(name, file)

    elif stringvalidators.validate_hash(name):
        try:
            resp = onionrblockapi.Block(name).bcontent
        except onionrexceptions.NoDataAvailable:
            abort(404)
        except TypeError:
            pass
        try:
            resp = base64.b64decode(resp)
        except binascii.Error:
            pass
    if resp == 'Not Found' or not resp:
        abort(404)
    return Response(resp, mimetype=mime_type)
Exemplo n.º 2
0
def client_api_insert_block():
    encrypt: bool = False
    insert_data: JSONSerializable = request.get_json(force=True)
    message = insert_data['message']
    message_hash = bytesconverter.bytes_to_str(hashers.sha3_hash(message))
    kv: 'DeadSimpleKV' = g.too_many.get_by_string('DeadSimpleKV')

    # Detect if message (block body) is not specified
    if type(message) is None:
        return 'failure due to unspecified message', 400

    # Detect if block with same message is already being inserted
    if message_hash in kv.get('generating_blocks'):
        return 'failure due to duplicate insert', 400
    else:
        kv.get('generating_blocks').append(message_hash)

    encrypt_type = ''
    sign = True
    meta = {}
    to = ''
    try:
        if insert_data['encrypt']:
            to = insert_data['to'].strip()
            if "-" in to:
                to = mnemonickeys.get_base32(to)
            encrypt_type = 'asym'
    except KeyError:
        pass
    try:
        if not insert_data['sign']:
            sign = False
    except KeyError:
        pass
    try:
        bType = insert_data['type']
    except KeyError:
        bType = 'bin'
    try:
        meta = json.loads(insert_data['meta'])
    except KeyError:
        pass

    try:
        # The setting in the UI is for if forward secrecy is enabled, not disabled
        disable_forward_secrecy = not insert_data['forward']
    except KeyError:
        disable_forward_secrecy = False

    threading.Thread(target=onionrblocks.insert,
                     args=(message, ),
                     kwargs={
                         'header': bType,
                         'encryptType': encrypt_type,
                         'sign': sign,
                         'asymPeer': to,
                         'meta': meta,
                         'disableForward': disable_forward_secrecy
                     }).start()
    return Response('success')
Exemplo n.º 3
0
def client_api_insert_block():
    encrypt = False
    bData = request.get_json(force=True)
    message = bData['message']
    message_hash = bytesconverter.bytes_to_str(hashers.sha3_hash(message))

    # Detect if message (block body) is not specified
    if type(message) is None:
        return 'failure due to unspecified message', 400

    # Detect if block with same message is already being inserted
    if message_hash in g.too_many.get_by_string(
            "OnionrCommunicatorDaemon").generating_blocks:
        return 'failure due to duplicate insert', 400
    else:
        g.too_many.get_by_string(
            "OnionrCommunicatorDaemon").generating_blocks.append(message_hash)

    subject = 'temp'
    encryptType = ''
    sign = True
    meta = {}
    to = ''
    try:
        if bData['encrypt']:
            to = bData['to'].strip()
            if "-" in to:
                to = mnemonickeys.get_base32(to)
            encrypt = True
            encryptType = 'asym'
    except KeyError:
        pass
    try:
        if not bData['sign']:
            sign = False
    except KeyError:
        pass
    try:
        bType = bData['type']
    except KeyError:
        bType = 'bin'
    try:
        meta = json.loads(bData['meta'])
    except KeyError:
        pass
    threading.Thread(target=onionrblocks.insert,
                     args=(message, ),
                     kwargs={
                         'header': bType,
                         'encryptType': encryptType,
                         'sign': sign,
                         'asymPeer': to,
                         'meta': meta
                     }).start()
    return Response('success')
Exemplo n.º 4
0
def remove_user(pubkey: str) -> bool:
    '''
        Remove a user from the user database
    '''
    pubkey = mnemonickeys.get_base32(pubkey)
    if stringvalidators.validate_pub_key(pubkey):
        conn = sqlite3.connect(dbfiles.user_id_info_db,
                               timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
        c = conn.cursor()
        t = (pubkey, )
        c.execute('Delete from peers where id=?;', t)
        conn.commit()
        conn.close()

        return True
    else:
        return False
Exemplo n.º 5
0
def find_site(user_id: str) -> Union[BlockHash, None]:
    """Returns block hash str for latest block for a site by a given user id"""
    # If mnemonic delim in key, convert to base32 version
    if mnemonickeys.DELIMITER in user_id:
        user_id = mnemonickeys.get_base32(user_id)

    if not stringvalidators.validate_pub_key(user_id):
        raise onionrexceptions.InvalidPubkey

    found_site = None
    sites = blockmetadb.get_blocks_by_type('zsite')

    # Find site by searching all site blocks. eww O(N) ☹️, TODO: event based
    for site in sites:
        site = Block(site)
        if site.isSigner(user_id) and site.verifySig():
            found_site = site.hash
    return found_site
Exemplo n.º 6
0
    def __init__(self, publicKey, saveUser=False, recordExpireSeconds=5):
        try:
            if mnemonickeys.DELIMITER in publicKey:
                publicKey = mnemonickeys.get_base32(publicKey)
                #publicKey = unpaddedbase32.b32encode(bytesconverter.str_to_bytes(publicKey))
        except ValueError:
            pass
        publicKey = bytesconverter.bytes_to_str(
            unpaddedbase32.repad(bytesconverter.str_to_bytes(publicKey)))
        super(ContactManager, self).__init__(publicKey, saveUser=saveUser)
        home = identifyhome.identify_home()
        self.dataDir = home + '/contacts/'
        self.dataFile = '%s/contacts/%s.json' % (home, publicKey)
        self.lastRead = 0
        self.recordExpire = recordExpireSeconds
        self.data = self._loadData()
        self.deleted = False

        if not os.path.exists(self.dataDir):
            os.mkdir(self.dataDir)
Exemplo n.º 7
0
 def get_base32_from_human_readable(words):
     return Response(
         bytesconverter.bytes_to_str(mnemonickeys.get_base32(words)))