def do_taa_validation(self, request: Request, req_pp_time: int, config): ledger_id = self.get_lid_for_request(request) if not self.database_manager.is_taa_acceptance_required(ledger_id): if request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance is not expected" " and not allowed in requests for ledger id {}".format( ledger_id)) else: logger.trace("{} TAA acceptance passed for request {}: " "not required for ledger id {}".format( self, request.reqId, ledger_id)) return taa = None taa_data = self.get_taa_data() if taa_data is not None: (taa, taa_seq_no, taa_txn_time), taa_digest = taa_data if taa is None: if request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance has not been set yet" " and not allowed in requests") else: logger.trace( "{} TAA acceptance passed for request {}: taa is not set". format(self, request.reqId)) return if not taa[TXN_AUTHOR_AGREEMENT_TEXT]: if request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance is disabled" " and not allowed in requests") else: logger.trace( "{} TAA acceptance passed for request {}: taa is disabled". format(self, request.reqId)) return if not taa_digest: raise LogicError( "Txn Author Agreement digest is not defined: version {}, seq_no {}, txn_time {}" .format(taa[TXN_AUTHOR_AGREEMENT_VERSION], taa_seq_no, taa_txn_time)) if not request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance is required for ledger with id {}" .format(ledger_id)) r_taa_a_digest = request.taaAcceptance[f.TAA_ACCEPTANCE_DIGEST.nm] if r_taa_a_digest != taa_digest: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance digest is invalid or non-latest:" " provided {}, expected {}".format(r_taa_a_digest, taa_digest)) r_taa_a_ts = request.taaAcceptance[f.TAA_ACCEPTANCE_TIME.nm] datetime_r_taa = datetime.utcfromtimestamp(r_taa_a_ts) if datetime_r_taa.time() != time(0): raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance time {}" " is too precise and is a privacy risk.".format(r_taa_a_ts)) date_lowest = datetime.utcfromtimestamp( taa_txn_time - config.TXN_AUTHOR_AGREEMENT_ACCEPTANCE_TIME_BEFORE_TAA_TIME).date( ) date_higest = datetime.utcfromtimestamp( req_pp_time + config.TXN_AUTHOR_AGREEMENT_ACCEPTANCE_TIME_AFTER_PP_TIME).date() if (datetime_r_taa.date() < date_lowest) or (datetime_r_taa.date() > date_higest): raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance time is inappropriate:" " provided {}, expected in [{}, {}]".format( r_taa_a_ts, date_lowest, date_higest)) taa_aml_data = self.get_taa_aml_data() if taa_aml_data is None: raise TaaAmlNotSetError( "Txn Author Agreement acceptance mechanism list is not defined" ) taa_aml = taa_aml_data[VALUE][AML] r_taa_a_mech = request.taaAcceptance[f.TAA_ACCEPTANCE_MECHANISM.nm] if r_taa_a_mech not in taa_aml: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, "Txn Author Agreement acceptance mechanism is inappropriate:" " provided {}, expected one of {}".format( r_taa_a_mech, sorted(taa_aml))) logger.trace("{} TAA acceptance passed for request {}".format( self, request.reqId))
def do_taa_validation(self, request: Request, req_pp_time: int, config): ledger_id = self.get_lid_for_request(request) if not self.database_manager.is_taa_acceptance_required(ledger_id): if request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_NOT_EXPECTED_FOR_LEDGER.reason.format( ledger_id), Rejects.TAA_NOT_EXPECTED_FOR_LEDGER.code) else: logger.trace("{} TAA acceptance passed for request {}: " "not required for ledger id {}".format( self, request.reqId, ledger_id)) return if not self.get_taa_data(isCommitted=False): logger.trace("{} TAA acceptance passed for request {}: " "taa is disabled".format(self, request.reqId)) return if not request.taaAcceptance: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_MISSING_FOR_LEDGER.reason.format(ledger_id), Rejects.TAA_MISSING_FOR_LEDGER.code) taa = None r_taa_a_digest = request.taaAcceptance.get(f.TAA_ACCEPTANCE_DIGEST.nm) taa_data = self.get_taa_data(digest=r_taa_a_digest, isCommitted=False) if taa_data is not None: (taa, taa_seq_no, taa_txn_time), taa_digest = taa_data else: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_NOT_FOUND.reason.format(r_taa_a_digest), Rejects.TAA_NOT_FOUND.code) retired = taa.get(TXN_AUTHOR_AGREEMENT_RETIREMENT_TS) if retired and retired < req_pp_time: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_RETIRED.reason.format( taa[TXN_AUTHOR_AGREEMENT_VERSION], taa_seq_no, taa_txn_time), Rejects.TAA_RETIRED.code) r_taa_a_ts = request.taaAcceptance[f.TAA_ACCEPTANCE_TIME.nm] datetime_r_taa = datetime.utcfromtimestamp(r_taa_a_ts) if datetime_r_taa.time() != time(0): raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_TOO_PRECISE.reason.format(r_taa_a_ts), Rejects.TAA_RETIRED.code) taa_txn_creation_time = taa.get(TXN_AUTHOR_AGREEMENT_RATIFICATION_TS, taa_txn_time) date_lowest = datetime.utcfromtimestamp( taa_txn_creation_time - config.TXN_AUTHOR_AGREEMENT_ACCEPTANCE_TIME_BEFORE_TAA_TIME).date( ) date_higest = datetime.utcfromtimestamp( req_pp_time + config.TXN_AUTHOR_AGREEMENT_ACCEPTANCE_TIME_AFTER_PP_TIME).date() if (datetime_r_taa.date() < date_lowest) or (datetime_r_taa.date() > date_higest): raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_WRONG_ACCEPTANCE_TIME.reason.format( r_taa_a_ts, date_lowest, date_higest), Rejects.TAA_WRONG_ACCEPTANCE_TIME.code) taa_aml_data = self.get_taa_aml_data() if taa_aml_data is None: raise TaaAmlNotSetError( "Txn Author Agreement acceptance mechanism list is not defined" ) taa_aml = taa_aml_data[VALUE][AML] r_taa_a_mech = request.taaAcceptance[f.TAA_ACCEPTANCE_MECHANISM.nm] if r_taa_a_mech not in taa_aml: raise InvalidClientTaaAcceptanceError( request.identifier, request.reqId, Rejects.TAA_AML_INVALID.reason.format(r_taa_a_mech, sorted(taa_aml)), Rejects.TAA_AML_INVALID.code) logger.trace("{} TAA acceptance passed for request {}".format( self, request.reqId))