From 4a5b043fb540226b96e6cb54918a46427d36b0e3 Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 26 Oct 2020 12:42:26 +0100 Subject: [PATCH] update transaction decoding for debugging messages from hedera block explorer --- skeema/gradido_login/pending_tasks.sql | 7 +- .../HTTPInterface/CheckTransactionPage.cpp | 2 +- .../HTTPInterface/DecodeTransactionPage.cpp | 102 ++++++++++++------ src/cpp/model/gradido/Transaction.cpp | 19 +++- src/cpp/model/hedera/Transaction.cpp | 1 + src/cpp/model/hedera/TransactionBody.cpp | 7 +- src/cpp/model/table/PendingTask.cpp | 13 +-- src/cpp/model/table/PendingTask.h | 15 ++- src/cpsp/checkTransaction.cpsp | 2 +- src/cpsp/decodeTransaction.cpsp | 40 +++++-- 10 files changed, 153 insertions(+), 55 deletions(-) diff --git a/skeema/gradido_login/pending_tasks.sql b/skeema/gradido_login/pending_tasks.sql index 0abb5adbe..702db8484 100644 --- a/skeema/gradido_login/pending_tasks.sql +++ b/skeema/gradido_login/pending_tasks.sql @@ -5,5 +5,8 @@ CREATE TABLE `pending_tasks` ( `created` datetime NOT NULL, `finished` datetime DEFAULT '2000-01-01 000000', `result_json` varchar(255) DEFAULT NULL, - `task_type_id` int UNSIGNED NOT NULL -) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;; + `task_type_id` int UNSIGNED NOT NULL, + `child_pending_task_id` int UNSIGNED DEFAULT 0, + `parent_pending_task_id` int UNSIGNED DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/cpp/HTTPInterface/CheckTransactionPage.cpp b/src/cpp/HTTPInterface/CheckTransactionPage.cpp index 274b4c09a..5ec8a690f 100644 --- a/src/cpp/HTTPInterface/CheckTransactionPage.cpp +++ b/src/cpp/HTTPInterface/CheckTransactionPage.cpp @@ -64,7 +64,7 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, bool transaction_finalize_run = false; bool transaction_finalize_result = false; auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user); - model::gradido::Transaction* transaction; + model::gradido::Transaction* transaction = nullptr; Poco::AutoPtr transaction_body; if(transactions_to_sign.size() > 0) diff --git a/src/cpp/HTTPInterface/DecodeTransactionPage.cpp b/src/cpp/HTTPInterface/DecodeTransactionPage.cpp index f93d1e3bf..1d66e4afd 100644 --- a/src/cpp/HTTPInterface/DecodeTransactionPage.cpp +++ b/src/cpp/HTTPInterface/DecodeTransactionPage.cpp @@ -8,10 +8,12 @@ #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" #include "sodium.h" +#include "../proto/gradido/GradidoTransaction.pb.h" #include "../proto/gradido/TransactionBody.pb.h" #include "../controller/User.h" #include "../model/gradido/TransactionBase.h" #include "../model/gradido/TransactionCreation.h" +#include "../lib/DataTypeConverter.h" #line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" #include "../ServerConfig.h" @@ -31,10 +33,11 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, if (_compressResponse) response.set("Content-Encoding", "gzip"); Poco::Net::HTMLForm form(request, request.stream()); -#line 14 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 16 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" const char* pageName = "Decode Transaction"; proto::gradido::TransactionBody transactionBody; + proto::gradido::GradidoTransaction transaction; bool decoded = false; bool adminUser = false; if(mSession && mSession->getNewUser()) { @@ -51,6 +54,7 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, size_t resultingBinSize = 0; size_t base64_size = base64.size(); bool encodingValid = false; + bool encodedTransaction = false; if (!sodium_base642bin( binBuffer, base64_size, base64.data(), base64_size, @@ -63,9 +67,10 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, base64.data(), base64_size, nullptr, &resultingBinSize, nullptr, sodium_base64_VARIANT_URLSAFE_NO_PADDING)) { - //encodingValid = true; + encodingValid = true; //free(binBuffer); - addError(new Error("ProcessingTransaction", "it is maybe a Transaction, but I support only TransactionBodys"), false); + //addError(new Error("ProcessingTransaction", "it is maybe a Transaction, but I support only TransactionBodys"), false); + encodedTransaction = true; } if(false == encodingValid) { free(binBuffer); @@ -73,11 +78,24 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, } else { std::string binString((char*)binBuffer, resultingBinSize); free(binBuffer); - - if (!transactionBody.ParseFromString(binString)) { - addError(new Error("ProcessingTransaction", "error creating Transaction from binary Message"), false); + if(!encodedTransaction) { + + if (!transactionBody.ParseFromString(binString)) { + addError(new Error("ProcessingTransaction", "error creating Transaction Body from binary Message"), false); + } else { + decoded = true; + } } else { - decoded = true; + + if(!transaction.ParseFromString(binString)) { + addError(new Error("ProcessingTransaction", "error creating Transaction from binary Message"), false); + } else { + if(!transactionBody.ParseFromString(transaction.body_bytes())) { + addError(new Error("ProcessingTransaction", "error creating Transaction Body from Transaction body bytes"), false); + } else { + decoded = true; + } + } } } @@ -158,35 +176,35 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "
\n"; responseStream << "\t

Transaktion dekodieren

\n"; responseStream << "\t"; -#line 72 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 90 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "\t
\n"; responseStream << "\t\t
\n"; responseStream << "\t\t\tTransaktion dekodieren\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t
\n"; responseStream << "\t\t\n"; responseStream << "\t
\n"; responseStream << "\t"; -#line 80 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" if(decoded) { responseStream << "\n"; responseStream << "\t\t

Verwendungszweck:

\n"; responseStream << "\t\t

"; -#line 82 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 100 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( transactionBody.memo() ); responseStream << "

\n"; responseStream << "\t\t"; -#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 101 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" if(transactionBody.has_transfer()) { auto transfer = transactionBody.transfer(); char hex[65]; memset(hex, 0, 65); responseStream << "\n"; responseStream << "\t\t\t"; -#line 87 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 105 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" if(transfer.has_local()) { auto local_transfer = transfer.local(); auto sender_pubkey = local_transfer.sender().pubkey(); @@ -195,29 +213,29 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\n"; responseStream << "\t\t\t\t

Local Transfer

\n"; responseStream << "\t\t\t\tFrom: "; -#line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 113 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" sodium_bin2hex(hex, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); responseStream << "\n"; responseStream << "\t\t\t\tTo: "; -#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 114 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "\n"; responseStream << "\t\t\t\tAmount: "; -#line 97 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 115 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( model::gradido::TransactionBase::amountToString(local_transfer.sender().amount()) ); responseStream << "\n"; responseStream << "\t\t\t"; -#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 116 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t

- Not implemented yet (Group Transfer) -

\n"; responseStream << "\t\t\t"; -#line 100 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 118 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t"; -#line 102 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 120 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else if(transactionBody.has_creation()) { auto creation = transactionBody.creation(); @@ -238,36 +256,60 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\n"; responseStream << "\t\t

Creation

\n"; responseStream << "\t\t"; -#line 120 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 139 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" if(!adminUser || user.isNull() || !user->getModel()) { responseStream << "\n"; responseStream << "\t\t

pubkey: "; -#line 121 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 140 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "

\n"; responseStream << "\t\t"; -#line 122 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 141 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t

user:

\n"; responseStream << "\t\t

"; -#line 124 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 143 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( user->getModel()->toHTMLString() ); responseStream << "

\n"; responseStream << "\t\t"; -#line 125 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t

amount: "; -#line 126 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" - responseStream << ( TransactionBase::amountToString(receiver.amount()) ); +#line 145 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( model::gradido::TransactionBase::amountToString(receiver.amount()) ); responseStream << " GDD

\n"; responseStream << "\t\t

target date: "; -#line 127 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( creationObject.getTargetDateString() ); responseStream << "

\n"; responseStream << "\t\t"; -#line 128 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 147 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + } else if(transactionBody.has_group_member_update()) { + auto group_member_update = transactionBody.group_member_update(); + auto paired_transaction_id = group_member_update.paired_transaction_id(); + std::string paired_transaction_string = std::to_string(paired_transaction_id.seconds()) + "." + std::to_string(paired_transaction_id.nanos()); + responseStream << "\n"; + responseStream << "\t\t\t

Group Member Update

\n"; + responseStream << "\t\t\t

Target group alias: "; +#line 153 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( group_member_update.target_group() ); + responseStream << "

\n"; + responseStream << "\t\t\t

Paired transaction id: "; +#line 154 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( paired_transaction_string ); + responseStream << "

\n"; + responseStream << "\t\t\t

Member Update Type: "; +#line 155 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( proto::gradido::GroupMemberUpdate_MemberUpdateType_Name(group_member_update.member_update_type()) ); + responseStream << "

\n"; + responseStream << "\t\t\t

User Public Key Hex: "; +#line 156 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( DataTypeConverter::pubkeyToHex((const unsigned char*)group_member_update.user_pubkey().data()) ); + responseStream << "

\n"; + responseStream << "\t\t"; +#line 157 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t"; -#line 129 "D:\\code\\gradido\\gradido_login_server_grpc\\src\\cpsp\\decodeTransaction.cpsp" +#line 158 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "
\n"; // begin include footer.cpsp diff --git a/src/cpp/model/gradido/Transaction.cpp b/src/cpp/model/gradido/Transaction.cpp index 917238049..4e151e65b 100644 --- a/src/cpp/model/gradido/Transaction.cpp +++ b/src/cpp/model/gradido/Transaction.cpp @@ -343,7 +343,14 @@ namespace model { if (!crypto_key.isNull()) { model::hedera::ConsensusSubmitMessage consensus_submit_message(topic_id); - consensus_submit_message.setMessage(mProtoTransaction.SerializeAsString()); + std::string raw_message = mProtoTransaction.SerializeAsString(); + // if using testnet, transfer message base64 encoded to check messages in hedera block explorer + if (network_type == table::HEDERA_TESTNET) { + consensus_submit_message.setMessage(DataTypeConverter::binToBase64((const unsigned char*)raw_message.data(), raw_message.size(), sodium_base64_VARIANT_URLSAFE_NO_PADDING)); + } + else { + consensus_submit_message.setMessage(raw_message); + } auto hedera_transaction_body = hedera_operator_account->createTransactionBody(); hedera_transaction_body->setConsensusSubmitMessage(consensus_submit_message); model::hedera::Transaction hedera_transaction; @@ -359,10 +366,16 @@ namespace model { return -2; } else { - auto hedera_precheck_code_string = hedera_task.getTransactionResponse()->getPrecheckCodeString(); - auto cost = hedera_task.getTransactionResponse()->getCost(); + auto hedera_transaction_response = hedera_task.getTransactionResponse(); + auto hedera_precheck_code_string = hedera_transaction_response->getPrecheckCodeString(); + auto precheck_code = hedera_transaction_response->getPrecheckCode(); + auto cost = hedera_transaction_response->getCost(); printf("hedera response: %s, cost: %" PRIu64 "\n", hedera_precheck_code_string.data(), cost); + if (precheck_code == proto::INVALID_TRANSACTION_START) { + int zahl = 0; + return -5; + } } //model::hedera::TransactionBody hedera_transaction_body() diff --git a/src/cpp/model/hedera/Transaction.cpp b/src/cpp/model/hedera/Transaction.cpp index 779488630..3d573bef2 100644 --- a/src/cpp/model/hedera/Transaction.cpp +++ b/src/cpp/model/hedera/Transaction.cpp @@ -49,6 +49,7 @@ namespace model { auto mm = MemoryManager::getInstance(); mConnection = transactionBody->getConnection(); + transactionBody->updateTimestamp(); auto transaction_body_proto = transactionBody->getProtoTransactionBody(); auto body_bytes = transaction_body_proto->SerializeAsString(); mTransaction->set_bodybytes(body_bytes.data(), body_bytes.size()); diff --git a/src/cpp/model/hedera/TransactionBody.cpp b/src/cpp/model/hedera/TransactionBody.cpp index 4ecae0fb9..d6662bc8d 100644 --- a/src/cpp/model/hedera/TransactionBody.cpp +++ b/src/cpp/model/hedera/TransactionBody.cpp @@ -127,8 +127,11 @@ namespace model { auto timestamp = transaction_id->mutable_transactionvalidstart(); Poco::Timestamp now; auto microseconds = now.epochMicroseconds() - now.epochTime() * now.resolution(); // 1*10^6 - timestamp->set_seconds(now.epochTime()); - timestamp->set_nanos(microseconds * 1000); + timestamp->set_seconds(now.epochTime()-1); + //timestamp->set_nanos(microseconds * 1000); + // make sure timestamp is some nanos old + timestamp->set_nanos(microseconds * 900); + printf("hedera transaction body timestamp: %d.%d\n", timestamp->seconds(), timestamp->nanos()); } } } \ No newline at end of file diff --git a/src/cpp/model/table/PendingTask.cpp b/src/cpp/model/table/PendingTask.cpp index b88b659a4..9203b20e8 100644 --- a/src/cpp/model/table/PendingTask.cpp +++ b/src/cpp/model/table/PendingTask.cpp @@ -21,7 +21,7 @@ namespace model } PendingTask::PendingTask(const PendingTaskTuple& tuple) : ModelBase(tuple.get<0>()), mUserId(tuple.get<1>()), mRequest(tuple.get<2>()), mCreated(tuple.get<3>()), mFinished(tuple.get<4>()), - mResultJsonString(tuple.get<5>()), mTaskTypeId(tuple.get<6>()) + mResultJsonString(tuple.get<5>()), mTaskTypeId(tuple.get<6>()), mChildPendingTaskId(tuple.get<7>()), mParentPendingTaskId(tuple.get<8>()) { } @@ -96,9 +96,10 @@ namespace model { Poco::Data::Statement select(session); - select << "SELECT id, user_id, request, created, finished, result_json, task_type_id FROM " << getTableName() + select << "SELECT id, user_id, request, created, finished, result_json, task_type_id, child_pending_task_id, parent_pending_task_id FROM " << getTableName() << " where " << fieldName << " = ?" - , into(mID), into(mUserId), into(mRequest), into(mCreated), into(mFinished), into(mResultJsonString), into(mTaskTypeId); + , into(mID), into(mUserId), into(mRequest), into(mCreated), into(mFinished), into(mResultJsonString), + into(mTaskTypeId), into(mChildPendingTaskId), into(mParentPendingTaskId); return select; } @@ -107,7 +108,7 @@ namespace model { Poco::Data::Statement select(session); - select << "SELECT id, user_id, request, created, finished, result_json, task_type_id FROM " << getTableName(); + select << "SELECT id, user_id, request, created, finished, result_json, task_type_id, child_pending_task_id, parent_pending_task_id FROM " << getTableName(); return select; } @@ -131,8 +132,8 @@ namespace model Poco::Data::Statement insert(session); lock(); insert << "INSERT INTO " << getTableName() - << " (user_id, request, created, task_type_id) VALUES(?,?,?,?)" - , use(mUserId), use(mRequest), use(mCreated), use(mTaskTypeId); + << " (user_id, request, created, task_type_id, child_pending_task_id, parent_pending_task_id) VALUES(?,?,?,?,?,?)" + , use(mUserId), use(mRequest), use(mCreated), use(mTaskTypeId), use(mChildPendingTaskId), use(mParentPendingTaskId); unlock(); return insert; } diff --git a/src/cpp/model/table/PendingTask.h b/src/cpp/model/table/PendingTask.h index 3ac0cbb9a..85a876ae7 100644 --- a/src/cpp/model/table/PendingTask.h +++ b/src/cpp/model/table/PendingTask.h @@ -20,8 +20,8 @@ namespace model { TASK_TYPE_HEDERA_ACCOUNT_CREATE = 25, }; - - typedef Poco::Tuple PendingTaskTuple; + + typedef Poco::Tuple PendingTaskTuple; class PendingTask : public ModelBase { @@ -45,13 +45,18 @@ namespace model { inline std::string getRequestCopy() const { SHARED_LOCK; return std::string((const char*)mRequest.content().data(), mRequest.content().size()); } inline Poco::DateTime getCreated() const { SHARED_LOCK; return mCreated; } inline TaskType getTaskType() const { SHARED_LOCK; return (TaskType)mTaskTypeId; } + inline int getChildPendingTaskId() const { SHARED_LOCK; return mChildPendingTaskId; } + inline int getParentPendingTaskId() const { SHARED_LOCK; return mParentPendingTaskId; } inline void setUserId(int userId) { UNIQUE_LOCK; mUserId = userId; } - inline void setTaskType(TaskType type) { UNIQUE_LOCK; mTaskTypeId = type; } void setRequest(const std::string& serializedProto); - inline bool isGradidoTransaction() { SHARED_LOCK; return isGradidoTransaction((TaskType)mTaskTypeId); } + inline void setTaskType(TaskType type) { UNIQUE_LOCK; mTaskTypeId = type; } + inline void setChildPendingTaskId(int childPendingTaskId) {UNIQUE_LOCK; mChildPendingTaskId = childPendingTaskId;} + inline void setParentPendingTaskId(int parentPendingTaskId) { UNIQUE_LOCK; mParentPendingTaskId = parentPendingTaskId; } + inline bool isGradidoTransaction() { SHARED_LOCK; return isGradidoTransaction((TaskType)mTaskTypeId); } static bool isGradidoTransaction(TaskType type); + static const char* typeToString(TaskType type); protected: Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); @@ -65,6 +70,8 @@ namespace model { Poco::DateTime mFinished; std::string mResultJsonString; int mTaskTypeId; + int mChildPendingTaskId; + int mParentPendingTaskId; std::shared_mutex mSharedMutex; }; diff --git a/src/cpsp/checkTransaction.cpsp b/src/cpsp/checkTransaction.cpsp index 99f5e4724..b3af1cd8c 100644 --- a/src/cpsp/checkTransaction.cpsp +++ b/src/cpsp/checkTransaction.cpsp @@ -46,7 +46,7 @@ enum PageState { bool transaction_finalize_run = false; bool transaction_finalize_result = false; auto transactions_to_sign = pt->getTransactionsUserMustSign(account_user); - model::gradido::Transaction* transaction; + model::gradido::Transaction* transaction = nullptr; Poco::AutoPtr transaction_body; if(transactions_to_sign.size() > 0) diff --git a/src/cpsp/decodeTransaction.cpsp b/src/cpsp/decodeTransaction.cpsp index 2c12d7824..b015f7fa9 100644 --- a/src/cpsp/decodeTransaction.cpsp +++ b/src/cpsp/decodeTransaction.cpsp @@ -6,14 +6,17 @@ <%@ header include="SessionHTTPRequestHandler.h" %> <%! #include "sodium.h" +#include "../proto/gradido/GradidoTransaction.pb.h" #include "../proto/gradido/TransactionBody.pb.h" #include "../controller/User.h" #include "../model/gradido/TransactionBase.h" #include "../model/gradido/TransactionCreation.h" +#include "../lib/DataTypeConverter.h" %> <%% const char* pageName = "Decode Transaction"; proto::gradido::TransactionBody transactionBody; + proto::gradido::GradidoTransaction transaction; bool decoded = false; bool adminUser = false; if(mSession && mSession->getNewUser()) { @@ -30,6 +33,7 @@ size_t resultingBinSize = 0; size_t base64_size = base64.size(); bool encodingValid = false; + bool encodedTransaction = false; if (!sodium_base642bin( binBuffer, base64_size, base64.data(), base64_size, @@ -42,9 +46,10 @@ base64.data(), base64_size, nullptr, &resultingBinSize, nullptr, sodium_base64_VARIANT_URLSAFE_NO_PADDING)) { - //encodingValid = true; + encodingValid = true; //free(binBuffer); - addError(new Error("ProcessingTransaction", "it is maybe a Transaction, but I support only TransactionBodys"), false); + //addError(new Error("ProcessingTransaction", "it is maybe a Transaction, but I support only TransactionBodys"), false); + encodedTransaction = true; } if(false == encodingValid) { free(binBuffer); @@ -52,11 +57,24 @@ } else { std::string binString((char*)binBuffer, resultingBinSize); free(binBuffer); - - if (!transactionBody.ParseFromString(binString)) { - addError(new Error("ProcessingTransaction", "error creating Transaction from binary Message"), false); + if(!encodedTransaction) { + + if (!transactionBody.ParseFromString(binString)) { + addError(new Error("ProcessingTransaction", "error creating Transaction Body from binary Message"), false); + } else { + decoded = true; + } } else { - decoded = true; + + if(!transaction.ParseFromString(binString)) { + addError(new Error("ProcessingTransaction", "error creating Transaction from binary Message"), false); + } else { + if(!transactionBody.ParseFromString(transaction.body_bytes())) { + addError(new Error("ProcessingTransaction", "error creating Transaction Body from Transaction body bytes"), false); + } else { + decoded = true; + } + } } } @@ -125,6 +143,16 @@ <% } %>

amount: <%= model::gradido::TransactionBase::amountToString(receiver.amount()) %> GDD

target date: <%= creationObject.getTargetDateString() %>

+ <% } else if(transactionBody.has_group_member_update()) { + auto group_member_update = transactionBody.group_member_update(); + auto paired_transaction_id = group_member_update.paired_transaction_id(); + std::string paired_transaction_string = std::to_string(paired_transaction_id.seconds()) + "." + std::to_string(paired_transaction_id.nanos()); + %> +

Group Member Update

+

Target group alias: <%= group_member_update.target_group() %>

+

Paired transaction id: <%= paired_transaction_string %>

+

Member Update Type: <%= proto::gradido::GroupMemberUpdate_MemberUpdateType_Name(group_member_update.member_update_type()) %>

+

User Public Key Hex: <%= DataTypeConverter::pubkeyToHex((const unsigned char*)group_member_update.user_pubkey().data()) %>

<% } %> <% } %>