async def close(self) -> None: """ Explicit exit. If so configured, populate cache to prove all creds in wallet offline if need be, archive cache, and purge prior cache archives. :return: current object """ LOGGER.debug('HolderProver.close >>>') if self.cfg.get('archive-cache-on-close', False): await self.load_cache(True) Caches.purge_archives(self.dir_cache, True) await super().close() for path_rr_id in Tails.links(self._dir_tails): rr_id = basename(path_rr_id) try: await self._sync_revoc(rr_id) except ClosedPool: LOGGER.warning( 'HolderProver sync-revoc on close required ledger for %s but pool was closed', rr_id) LOGGER.debug('HolderProver.close <<<')
def rev_regs(self) -> list: """ Return list of revocation registry identifiers for which HolderProver has tails files. :return: list of revocation registry identifiers for which HolderProver has tails files """ LOGGER.debug('HolderProver.rev_regs >>>') rv = [basename(f) for f in Tails.links(self._dir_tails)] LOGGER.debug('HolderProver.rev_regs <<< %s', rv) return rv
async def open(self) -> 'Issuer': """ Explicit entry. Perform ancestor opening operations, then synchronize revocation registry to tails tree content. :return: current object """ LOGGER.debug('Issuer.open >>>') await super().open() for path_rr_id in Tails.links(self._dir_tails, self.did): await self._sync_revoc(basename(path_rr_id)) LOGGER.debug('Issuer.open <<<') return self
async def open(self) -> 'HolderProver': """ Explicit entry. Perform ancestor opening operations, then parse cache from archive if so configured, and synchronize revocation registry to tails tree content. :return: current object """ LOGGER.debug('HolderProver.open >>>') await super().open() if self.cfg.get('parse-cache-on-open', False): Caches.parse(self.dir_cache) for path_rr_id in Tails.links(self._dir_tails): await self._sync_revoc(basename(path_rr_id)) LOGGER.debug('HolderProver.open <<<') return self
async def get_box_ids_json(self) -> str: """ Return json object on lists of all unique box identifiers (schema identifiers, credential definition identifiers, and revocation registry identifiers) for all credential definitions and credentials issued; e.g., :: { "schema_id": [ "R17v42T4pk...:2:tombstone:1.2", ... ], "cred_def_id": [ "R17v42T4pk...:3:CL:19:0", ... ] "rev_reg_id": [ "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:0:CL_ACCUM:0", "R17v42T4pk...:4:R17v42T4pk...:3:CL:19:0:CL_ACCUM:1", ... ] } An issuer must issue a credential definition to include its schema identifier in the returned values; the schema identifier in isolation belongs properly to an Origin, not necessarily to an Issuer. The operation may be useful for a Verifier agent going off-line to seed its cache before doing so. :return: tuple of sets for schema ids, cred def ids, rev reg ids """ LOGGER.debug('Issuer.get_box_ids_json >>>') cd_ids = [ d for d in listdir(self._dir_tails) if isdir(join(self._dir_tails, d)) and d.startswith('{}:3:'.format(self.did)) ] s_ids = [] for cd_id in cd_ids: try: s_ids.append( json.loads(await self.get_schema(cred_def_id2seq_no(cd_id) ))['id']) except AbsentSchema: LOGGER.error( 'Issuer %s has issued cred def %s but no corresponding schema on ledger', self.wallet.name, cd_id) rr_ids = [ basename(link) for link in Tails.links(self._dir_tails, self.did) ] rv = json.dumps({ 'schema_id': s_ids, 'cred_def_id': cd_ids, 'rev_reg_id': rr_ids }) LOGGER.debug('Issuer.get_box_ids_json <<< %s', rv) return rv