def showOutput(self): while type(self.channel) is type(None) and self.flowRunning: time.sleep(1) try: while self.flowRunning: for block in blockmetadb.get_blocks_by_type('brd'): if block in self.alreadyOutputed: continue block = Block(block) b_hash = bytesconverter.bytes_to_str(block.getHash()) if block.getMetadata('ch') != self.channel: continue if not self.flowRunning: break logger.info('\n------------------------', prompt=False, terminal=True) content = block.getContent() # Escape new lines, remove trailing whitespace, and escape ansi sequences content = escapeansi.escape_ANSI(content.replace( b'\n', b'\\n').replace(b'\r', b'\\r').strip().decode('utf-8')) logger.info(block.getDate().strftime( "%m/%d %H:%M") + ' - ' + logger.colors.reset + content, prompt=False, terminal=True) self.alreadyOutputed.append(b_hash) time.sleep(5) except KeyboardInterrupt: self.flowRunning = False
def print_site_list(): """Create a new MOTD message for the Onionr network.""" block_list = get_blocks_by_type('osite') if not block_list: logger.info('No sites saved right now', terminal=True) for block in block_list: block = Block(block) if block.isSigned(): logger.info(block.signer.replace('=', ''), terminal=True) else: logger.info(block.hash, terminal=True)
def get_motd()->Response: motds = blockmetadb.get_blocks_by_type("motd") newest_time = 0 message = "No MOTD currently present." for x in motds: bl = onionrblocks.onionrblockapi.Block(x) if not bl.verifySig() or bl.signer != bytesconverter.bytes_to_str(unpaddedbase32.repad(bytesconverter.str_to_bytes(signer))): continue if not bl.isSigner(signer): continue if bl.claimedTime > newest_time: newest_time = bl.claimedTime message = bl.bcontent return Response(message, headers={"Content-Type": "text/plain"})
def find_site_gzip(user_id: str) -> tarfile.TarFile: """Return verified site tar object""" sites = blockmetadb.get_blocks_by_type('osite') user_site = None user_id = unpaddedbase32.repad(user_id) for site in sites: block = onionrblockapi.Block(site) if block.isSigner(user_id): user_site = block if not user_site is None: return tarfile.open(fileobj=io.BytesIO(user_site.bcontent), mode='r') return None
def load_inbox(): inbox_list = [] deleted = simplekv.DeadSimpleKV(identifyhome.identify_home() + '/mailcache.dat').get('deleted_mail') if deleted is None: deleted = [] for blockHash in blockmetadb.get_blocks_by_type('pm'): block = onionrblockapi.Block(blockHash) block.decrypt() if block.decrypted and reconstructhash.deconstruct_hash( blockHash) not in deleted: inbox_list.append(blockHash) return inbox_list
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 service_creator(daemon): assert isinstance(daemon, communicator.OnionrCommunicatorDaemon) # Find socket connection blocks # TODO cache blocks and only look at recently received ones con_blocks = blockmetadb.get_blocks_by_type('con') for b in con_blocks: if not b in daemon.active_services: bl = onionrblockapi.Block(b, decrypt=True) bs = bytesconverter.bytes_to_str(bl.bcontent) + '.onion' if server_exists(bl.signer): continue if stringvalidators.validate_pub_key(bl.signer) and stringvalidators.validate_transport(bs): signer = bytesconverter.bytes_to_str(bl.signer) daemon.active_services.append(b) daemon.active_services.append(signer) if not daemon.services.create_server(signer, bs, daemon): daemon.active_services.remove(b) daemon.active_services.remove(signer) daemon.decrementThreadCount('service_creator')
def get_blocks_by_type_endpoint(name): blocks = blockmetadb.get_blocks_by_type(name) return Response(','.join(blocks))
def refresh_db(self): self.check_time = get_epoch() if not self.block_type: self.block_list = get_block_list() else: self.block_list = get_blocks_by_type(self.block_type)