def dynamic_validation(self, request: Request): self._validate_request_type(request) self.authorize(request) operation, identifier, req_id = request.operation, request.identifier, request.reqId if self.state.get(StaticTAAHelper.state_path_taa_aml_latest()) is None: raise InvalidClientRequest(identifier, req_id, "TAA txn is forbidden until TAA AML is set. Send TAA AML first.") version = operation[TXN_AUTHOR_AGREEMENT_VERSION] if StaticTAAHelper.get_taa_digest(self.state, version, isCommitted=False) is not None: raise InvalidClientRequest(identifier, req_id, "Changing existing version of transaction author agreement is forbidden")
def authorize(self, request): version = request.operation.get(TXN_AUTHOR_AGREEMENT_VERSION) if StaticTAAHelper.get_taa_digest(self.state, version, isCommitted=False) is None: self.write_req_validator.validate(request, [AuthActionAdd(txn_type=self.txn_type, field='*', value='*')]) else: self.write_req_validator.validate(request, [AuthActionEdit(txn_type=self.txn_type, field='*', old_value='*', new_value='*')])
def update_state(self, txn, prev_result, request, is_committed=False): self._validate_txn_type(txn) payload = get_payload_data(txn) text = payload.get(TXN_AUTHOR_AGREEMENT_TEXT) version = payload[TXN_AUTHOR_AGREEMENT_VERSION] retired = payload.get(TXN_AUTHOR_AGREEMENT_RETIREMENT_TS) ratified = payload.get(TXN_AUTHOR_AGREEMENT_RATIFICATION_TS) seq_no = get_seq_no(txn) txn_time = get_txn_time(txn) digest = StaticTAAHelper.get_taa_digest(self.state, version, isCommitted=False) if digest is None: digest = StaticTAAHelper.taa_digest(text, version) self._add_taa_to_state(digest, seq_no, txn_time, text, version, ratified) else: self._update_taa_to_state(digest, seq_no, txn_time, retired)
def dynamic_validation(self, request: Request, req_pp_time: Optional[int]): self._validate_request_type(request) self.authorize(request) operation, identifier, req_id = request.operation, request.identifier, request.reqId aml_latest, _, _ = self.get_from_state(StaticTAAHelper.state_path_taa_aml_latest()) if aml_latest is None: raise InvalidClientRequest(identifier, req_id, "TAA txn is forbidden until TAA AML is set. Send TAA AML first.") version = operation[TXN_AUTHOR_AGREEMENT_VERSION] digest = StaticTAAHelper.get_taa_digest(self.state, version, isCommitted=False) if digest is None: if req_pp_time is None: raise LogicError("Cannot validate TAA transaction outside of normal ordering") self._validate_add_taa(request, req_pp_time) else: self._validate_update_taa(request, digest)
def test_fill_ts_store_for_config_after_catchup(txnPoolNodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, tconf, tdir, allPluginsPath, set_txn_author_agreement_aml): sdk_send_txn_author_agreement(looper, sdk_pool_handle, sdk_wallet_trustee, *create_random_taa(), ratified=get_utc_epoch() - 600) node_to_disconnect = txnPoolNodeSet[-1] disconnect_node_and_ensure_disconnected(looper, txnPoolNodeSet, node_to_disconnect) looper.removeProdable(name=node_to_disconnect.name) sdk_reply = sdk_send_txn_author_agreement(looper, sdk_pool_handle, sdk_wallet_trustee, *create_random_taa(), ratified=get_utc_epoch() - 600) node_to_disconnect = start_stopped_node(node_to_disconnect, looper, tconf, tdir, allPluginsPath) txnPoolNodeSet[-1] = node_to_disconnect looper.run(checkNodesConnected(txnPoolNodeSet)) waitNodeDataEquality(looper, node_to_disconnect, *txnPoolNodeSet, exclude_from_check=['check_last_ordered_3pc_backup']) req_handler = node_to_disconnect.read_manager.request_handlers[ GET_TXN_AUTHOR_AGREEMENT] last_digest = StaticTAAHelper.get_taa_digest(req_handler.state) key = StaticTAAHelper.state_path_taa_digest(last_digest) root_hash = req_handler.database_manager.ts_store.get_equal_or_prev( get_txn_time(sdk_reply[1]['result'])) assert root_hash from_state = req_handler.state.get_for_root_hash(root_hash=root_hash, key=key) assert config_state_serializer.deserialize(from_state)['val']['text'] == \ get_payload_data(sdk_reply[1]['result'])['text']