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)
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')
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')
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
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
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)
def get_base32_from_human_readable(words): return Response( bytesconverter.bytes_to_str(mnemonickeys.get_base32(words)))