#include "DecodeTransactionPage.h" #include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerResponse.h" #include "Poco/Net/HTMLForm.h" #include "Poco/DeflatingStream.h" #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" #include "sodium.h" #include "../proto/gradido/TransactionBody.pb.h" #include "../controller/User.h" #include "../model/TransactionBase.h" #include "../model/TransactionCreation.h" #line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" #include "../ServerConfig.h" DecodeTransactionPage::DecodeTransactionPage(Session* arg): SessionHTTPRequestHandler(arg) { } void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) { response.setChunkedTransferEncoding(true); response.setContentType("text/html"); bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); 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" const char* pageName = "Decode Transaction"; model::messages::gradido::TransactionBody transactionBody; bool decoded = false; bool adminUser = false; if(mSession && mSession->getNewUser()) { auto user = mSession->getNewUser(); auto model = user->getModel(); if(model && model->getRole() == model::table::ROLE_ADMIN) { adminUser = true; } } if(!form.empty()) { auto base64 = form.get("transaction", ""); if(base64 != "") { unsigned char* binBuffer = (unsigned char*)malloc(base64.size()); size_t resultingBinSize = 0; size_t base64_size = base64.size(); bool encodingValid = false; if (!sodium_base642bin( binBuffer, base64_size, base64.data(), base64_size, nullptr, &resultingBinSize, nullptr, sodium_base64_VARIANT_ORIGINAL)) { encodingValid = true; } else if(!sodium_base642bin( binBuffer, base64_size, base64.data(), base64_size, nullptr, &resultingBinSize, nullptr, sodium_base64_VARIANT_URLSAFE_NO_PADDING)) { //encodingValid = true; //free(binBuffer); addError(new Error("ProcessingTransaction", "it is maybe a Transaction, but I support only TransactionBodys"), false); } if(false == encodingValid) { free(binBuffer); addError(new Error("ProcessingTransaction", "error decoding base64"), false); } else { std::string binString((char*)binBuffer, resultingBinSize); free(binBuffer); if (!transactionBody.ParseFromString(binString)) { addError(new Error("ProcessingTransaction", "error creating Transaction from binary Message"), false); } else { decoded = true; } } } } /* char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, const unsigned char * const bin, const size_t bin_len); */ std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; responseStream << "\n"; // begin include header_old.cpsp responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "Gradido Login Server: "; #line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" responseStream << ( pageName ); responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "\n"; responseStream << "
\n"; responseStream << "\t

Login Server in Entwicklung

\n"; responseStream << "\t

Alpha "; #line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" responseStream << ( ServerConfig::g_versionString ); responseStream << "

\n"; responseStream << "
\n"; // end include header_old.cpsp responseStream << "\n"; responseStream << "
\n"; responseStream << "\t

Transaktion dekodieren

\n"; responseStream << "\t"; #line 72 "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" if(decoded) { responseStream << "\n"; responseStream << "\t\t

Verwendungszweck:

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

"; #line 82 "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" if(transactionBody.has_transfer()) { auto transfer = transactionBody.transfer(); responseStream << "\n"; responseStream << "\t\t

Transfer

\n"; responseStream << "\t\tSender\n"; responseStream << "\t\t"; #line 88 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" for(int i = 0; i < transfer.senderamounts_size(); i++) { auto sender = transfer.senderamounts(i); char hex[65]; memset(hex, 0, 65); sodium_bin2hex(hex, 65, (const unsigned char*)sender.ed25519_sender_pubkey().data(), sender.ed25519_sender_pubkey().size()); responseStream << "\n"; responseStream << "\t\t\t

pubkey: "; #line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "

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

amount: "; #line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( TransactionBase::amountToString(sender.amount()) ); responseStream << " GDD

\n"; responseStream << "\t\t"; #line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\tReceiver\n"; responseStream << "\t\t"; #line 97 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" for(int i = 0; i < transfer.receiveramounts_size(); i++) { auto receiver = transfer.receiveramounts(i); char hex[65]; memset(hex, 0, 65); sodium_bin2hex(hex, 65, (const unsigned char*)receiver.ed25519_receiver_pubkey().data(), receiver.ed25519_receiver_pubkey().size()); responseStream << "\n"; responseStream << "\t\t\t

pubkey: "; #line 102 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "

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

amount: "; #line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( TransactionBase::amountToString(receiver.amount()) ); responseStream << " GDD

\n"; responseStream << "\t\t"; #line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t"; #line 105 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else if(transactionBody.has_creation()) { auto creation = transactionBody.creation(); TransactionCreation creationObject("", creation); auto receiver = creation.receiveramount(); char hex[65]; memset(hex, 0, 65); sodium_bin2hex(hex, 65, (const unsigned char*)receiver.ed25519_receiver_pubkey().data(), receiver.ed25519_receiver_pubkey().size()); Poco::AutoPtr user = nullptr; if(adminUser) { user = controller::User::create(); if(!user->load((const unsigned char*)receiver.ed25519_receiver_pubkey().data())) { user.assign(nullptr); } } //pubkey responseStream << "\n"; responseStream << "\t\t

Creation

\n"; responseStream << "\t\t"; #line 122 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" if(!adminUser || user.isNull() || !user->getModel()) { responseStream << "\n"; responseStream << "\t\t

pubkey: "; #line 123 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "

\n"; responseStream << "\t\t"; #line 124 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t

user:

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

"; #line 126 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( user->getModel()->toHTMLString() ); responseStream << "

\n"; responseStream << "\t\t"; #line 127 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t

amount: "; #line 128 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( TransactionBase::amountToString(receiver.amount()) ); responseStream << " GDD

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

target date: "; #line 129 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( creationObject.getTargetDateString() ); responseStream << "

\n"; responseStream << "\t\t"; #line 130 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t"; #line 131 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "
\n"; // begin include footer.cpsp responseStream << "
\n"; responseStream << "

Copyright © Gradido 2020

\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "
\n"; responseStream << " "; #line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" responseStream << ( mTimeProfiler.string() ); responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << "

Login Server in Entwicklung

\n"; responseStream << "

Alpha "; #line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" responseStream << ( ServerConfig::g_versionString ); responseStream << "

\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << "\n"; responseStream << "\n"; responseStream << ""; // end include footer.cpsp if (_compressResponse) _gzipStream.close(); }