Пример #1
0
    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))
Пример #2
0
    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))