From 0552420cc25f3bad62b82abfeec92f6e0f3b2aef Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 21 Sep 2020 18:54:11 +0200 Subject: [PATCH] update proto files matching with pauls proto version, update code which use them --- .../HTTPInterface/DecodeTransactionPage.cpp | 89 +++++++++---------- src/cpp/model/TransactionCreation.cpp | 8 +- src/cpp/model/TransactionCreation.h | 8 +- src/cpp/model/TransactionTransfer.cpp | 74 +++++---------- src/cpp/model/TransactionTransfer.h | 6 +- src/cpp/tasks/ProcessingTransaction.h | 2 +- src/cpp/tasks/SigningTransaction.cpp | 10 +-- src/cpp/tasks/SigningTransaction.h | 2 +- src/cpsp/decodeTransaction.cpsp | 41 ++++----- 9 files changed, 101 insertions(+), 139 deletions(-) diff --git a/src/cpp/HTTPInterface/DecodeTransactionPage.cpp b/src/cpp/HTTPInterface/DecodeTransactionPage.cpp index 8348495e4..add8dfaad 100644 --- a/src/cpp/HTTPInterface/DecodeTransactionPage.cpp +++ b/src/cpp/HTTPInterface/DecodeTransactionPage.cpp @@ -33,7 +33,7 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, #line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" const char* pageName = "Decode Transaction"; - model::messages::gradido::TransactionBody transactionBody; + proto::gradido::TransactionBody transactionBody; bool decoded = false; bool adminUser = false; if(mSession && mSession->getNewUser()) { @@ -182,58 +182,51 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, #line 82 "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

Transfer

\n"; - responseStream << "\t\tSender\n"; - responseStream << "\t\t"; -#line 87 "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 << "\t\t\t"; +#line 86 "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(); + auto receiver_pubkey = local_transfer.receiver(); + sodium_bin2hex(hex, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size()); responseStream << "\n"; - responseStream << "\t\t\t

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

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

amount: "; + responseStream << "\t\t\t\t

Local Transfer

\n"; + responseStream << "\t\t\t\tFrom: "; #line 93 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" - responseStream << ( TransactionBase::amountToString(sender.amount()) ); - responseStream << " GDD

\n"; - responseStream << "\t\t"; -#line 94 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" - } responseStream << "\n"; - responseStream << "\t\tReceiver\n"; - responseStream << "\t\t"; -#line 96 "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 101 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); - responseStream << "

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

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

\n"; - responseStream << "\t\t"; -#line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << "\n"; + responseStream << "\t\t\t\t"; +#line 94 "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 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( hex ); + responseStream << "\n"; + responseStream << "\t\t\t\tAmount: "; +#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" + responseStream << ( TransactionBase::amountToString(local_transfer.sender().amount()) ); + responseStream << "\n"; + responseStream << "\t\t\t"; +#line 97 "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 99 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t"; -#line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 101 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } else if(transactionBody.has_creation()) { auto creation = transactionBody.creation(); - auto receiver = creation.receiveramount(); + auto receiver = creation.receiver(); char hex[65]; memset(hex, 0, 65); - sodium_bin2hex(hex, 65, (const unsigned char*)receiver.ed25519_receiver_pubkey().data(), receiver.ed25519_receiver_pubkey().size()); + sodium_bin2hex(hex, 65, (const unsigned char*)receiver.pubkey().data(), receiver.pubkey().size()); Poco::AutoPtr user = nullptr; if(adminUser) { user = controller::User::create(); - if(!user->load((const unsigned char*)receiver.ed25519_receiver_pubkey().data())) { + if(!user->load((const unsigned char*)receiver.pubkey().data())) { user.assign(nullptr); } } @@ -241,32 +234,32 @@ void DecodeTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\n"; responseStream << "\t\t

Creation

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

pubkey: "; -#line 121 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 118 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" responseStream << ( hex ); responseStream << "

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

user:

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

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

\n"; responseStream << "\t\t"; -#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 122 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t

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

\n"; responseStream << "\t\t"; -#line 127 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 124 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\t"; -#line 128 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" +#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\decodeTransaction.cpsp" } responseStream << "\n"; responseStream << "\n"; // begin include footer.cpsp diff --git a/src/cpp/model/TransactionCreation.cpp b/src/cpp/model/TransactionCreation.cpp index 8408823de..499aef61d 100644 --- a/src/cpp/model/TransactionCreation.cpp +++ b/src/cpp/model/TransactionCreation.cpp @@ -2,7 +2,7 @@ #include "Poco/DateTimeFormatter.h" #include -TransactionCreation::TransactionCreation(const std::string& memo, const model::messages::gradido::TransactionCreation& protoCreation) +TransactionCreation::TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation) : TransactionBase(memo), mProtoCreation(protoCreation), mReceiverUser(nullptr) { memset(mReceiverPublicHex, 0, 65); @@ -19,13 +19,13 @@ TransactionCreation::~TransactionCreation() int TransactionCreation::prepare() { const static char functionName[] = { "TransactionCreation::prepare" }; - if (!mProtoCreation.has_receiveramount()) { + if (!mProtoCreation.has_receiver()) { addError(new Error(functionName, "hasn't receiver amount")); return -1; } - auto receiverAmount = mProtoCreation.receiveramount(); + auto receiver_amount = mProtoCreation.receiver(); - auto receiverPublic = receiverAmount.ed25519_receiver_pubkey(); + auto receiverPublic = receiver_amount.pubkey(); if (receiverPublic.size() != 32) { addError(new Error(functionName, "receiver public invalid (size not 32)")); return -2; diff --git a/src/cpp/model/TransactionCreation.h b/src/cpp/model/TransactionCreation.h index a696ff962..ff1fd62a8 100644 --- a/src/cpp/model/TransactionCreation.h +++ b/src/cpp/model/TransactionCreation.h @@ -12,26 +12,26 @@ #pragma warning(disable:4800) #include "TransactionBase.h" -#include "../proto/gradido/TransactionCreation.pb.h" +#include "../proto/gradido/GradidoCreation.pb.h" #include "User.h" class TransactionCreation : public TransactionBase { public: - TransactionCreation(const std::string& memo, const model::messages::gradido::TransactionCreation& protoCreation); + TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation); ~TransactionCreation(); int prepare(); inline User* getUser() { return mReceiverUser; } - inline google::protobuf::int64 getAmount() { return mProtoCreation.receiveramount().amount(); } + inline google::protobuf::int64 getAmount() { return mProtoCreation.receiver().amount(); } inline char* getPublicHex() { return mReceiverPublicHex; } inline std::string getAmountString() { return amountToString(getAmount()); } std::string getTargetDateString(); protected: - const model::messages::gradido::TransactionCreation& mProtoCreation; + const proto::gradido::GradidoCreation& mProtoCreation; char mReceiverPublicHex[65]; User* mReceiverUser; }; diff --git a/src/cpp/model/TransactionTransfer.cpp b/src/cpp/model/TransactionTransfer.cpp index d90933530..54bf8b00e 100644 --- a/src/cpp/model/TransactionTransfer.cpp +++ b/src/cpp/model/TransactionTransfer.cpp @@ -46,7 +46,7 @@ void TransactionTransfer::KontoTableEntry::composeAmountCellString(google::proto // ******************************************************************************************************************************** -TransactionTransfer::TransactionTransfer(const std::string& memo, const model::messages::gradido::Transfer& protoTransfer) +TransactionTransfer::TransactionTransfer(const std::string& memo, const proto::gradido::GradidoTransfer& protoTransfer) : TransactionBase(memo), mProtoTransfer(protoTransfer) { @@ -61,67 +61,41 @@ int TransactionTransfer::prepare() { lock(); const static char functionName[] = { "TransactionTransfer::prepare" }; - if (mProtoTransfer.senderamounts_size() == 0) { - addError(new Error(functionName, "hasn't sender amount(s)")); - unlock(); - return -1; - } - if (mProtoTransfer.receiveramounts_size() == 0) { - addError(new Error(functionName, "hasn't receiver amount(s)")); - unlock(); - return -2; - } - mKontoTable.reserve(mProtoTransfer.senderamounts_size() + mProtoTransfer.receiveramounts_size()); + + mKontoTable.reserve(2); //auto receiverAmount = mProtoTransfer.receiveramount(); //auto senderAmount - int senderSum = 0; - int receiverSum = 0; char pubkeyHexTemp[65]; - for (int i = 0; i < mProtoTransfer.senderamounts_size(); i++) { - auto senderAmount = mProtoTransfer.senderamounts(i); - auto pubkey = senderAmount.ed25519_sender_pubkey(); - senderSum += senderAmount.amount(); - if (pubkey.size() != 32) { - addError(new ParamError(functionName, "invalid public key for sender ", i)); - unlock(); - return -3; - } - //User user((const unsigned char*)pubkey.data()); - auto user = controller::User::create(); - if (!user->load((const unsigned char*)pubkey.data())) { - sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size()); - mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, senderAmount.amount(), true)); + if (mProtoTransfer.has_local()) + { + auto local_transfer = mProtoTransfer.local(); + auto sender = local_transfer.sender(); + auto sender_pubkey = sender.pubkey(); + auto receiver_pubkey = local_transfer.receiver(); + auto amount = sender.amount(); + auto sender_user = controller::User::create(); + auto receiver_user = controller::User::create(); + + if (!sender_user->load((const unsigned char*)sender_pubkey.data())) { + sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size()); + mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, -amount, true)); } else { - mKontoTable.push_back(KontoTableEntry(user->getModel(), senderAmount.amount(), true)); + mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), -amount, true)); } - } - for (int i = 0; i < mProtoTransfer.receiveramounts_size(); i++) { - auto receiverAmount = mProtoTransfer.receiveramounts(i); - auto pubkey = receiverAmount.ed25519_receiver_pubkey(); - receiverSum += receiverAmount.amount(); - if (receiverAmount.ed25519_receiver_pubkey().size() != 32) { - addError(new ParamError(functionName, "invalid public key for receiver ", i)); - unlock(); - return -4; - } - auto user = controller::User::create(); - if (!user->load((const unsigned char*)pubkey.data())) { - sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)pubkey.data(), pubkey.size()); - mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, receiverAmount.amount(), false)); + + if (!receiver_user->load((const unsigned char*)receiver_pubkey.data())) { + sodium_bin2hex(pubkeyHexTemp, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); + mKontoTable.push_back(KontoTableEntry(pubkeyHexTemp, amount, true)); } else { - mKontoTable.push_back(KontoTableEntry(user->getModel(), receiverAmount.amount(), false)); + mKontoTable.push_back(KontoTableEntry(sender_user->getModel(), amount, true)); } - } - if (senderSum != receiverSum) { - addError(new Error(functionName, "sender amounts sum != receiver amounts sum")); - unlock(); - return -5; - } + } + // TODO: add version for group transfer /* diff --git a/src/cpp/model/TransactionTransfer.h b/src/cpp/model/TransactionTransfer.h index b57abd6b3..ff2acfa02 100644 --- a/src/cpp/model/TransactionTransfer.h +++ b/src/cpp/model/TransactionTransfer.h @@ -12,14 +12,14 @@ #pragma warning(disable:4800) #include "TransactionBase.h" -#include "../proto/gradido/Transfer.pb.h" +#include "../proto/gradido/GradidoTransfer.pb.h" #include "../controller/User.h" class TransactionTransfer : public TransactionBase { public: - TransactionTransfer(const std::string& memo, const model::messages::gradido::Transfer& protoTransfer); + TransactionTransfer(const std::string& memo, const proto::gradido::GradidoTransfer& protoTransfer); ~TransactionTransfer(); int prepare(); @@ -44,7 +44,7 @@ protected: void composeAmountCellString(google::protobuf::int64 amount, bool negativeAmount); }; - const model::messages::gradido::Transfer& mProtoTransfer; + const proto::gradido::GradidoTransfer& mProtoTransfer; std::vector mKontoTable; }; diff --git a/src/cpp/tasks/ProcessingTransaction.h b/src/cpp/tasks/ProcessingTransaction.h index 2bf2beb83..ed446935b 100644 --- a/src/cpp/tasks/ProcessingTransaction.h +++ b/src/cpp/tasks/ProcessingTransaction.h @@ -56,7 +56,7 @@ protected: TransactionType mType; std::string mProtoMessageBase64; - model::messages::gradido::TransactionBody mTransactionBody; + proto::gradido::TransactionBody mTransactionBody; TransactionBase* mTransactionSpecific; HASH mHash; diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 50e5953b3..8c23d6181 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -11,8 +11,6 @@ #include "../lib/Profiler.h" -#include "../proto/gradido/Transaction.pb.h" - #include "sodium.h" #include "../ServerConfig.h" @@ -96,8 +94,8 @@ int SigningTransaction::run() { } } // get body bytes - model::messages::gradido::Transaction transaction; - auto bodyBytes = transaction.mutable_bodybytes(); + proto::gradido::GradidoTransaction transaction; + auto bodyBytes = transaction.mutable_body_bytes(); *bodyBytes = mProcessingeTransaction->getBodyBytes(); if (*bodyBytes == "") { getErrors(mProcessingeTransaction); @@ -132,7 +130,7 @@ int SigningTransaction::run() { } */ // add to message - auto sigMap = transaction.mutable_sigmap(); + auto sigMap = transaction.mutable_sig_map(); auto sigPair = sigMap->add_sigpair(); auto pubkeyBytes = sigPair->mutable_pubkey(); @@ -147,7 +145,7 @@ int SigningTransaction::run() { /*std::string protoPrettyPrint; google::protobuf::TextFormat::PrintToString(transaction, &protoPrettyPrint); printf("transaction pretty: %s\n", protoPrettyPrint.data()); - model::messages::gradido::TransactionBody transactionBody; + proto::gradido::TransactionBody transactionBody; transactionBody.MergeFromString(transaction.bodybytes()); google::protobuf::TextFormat::PrintToString(transactionBody, &protoPrettyPrint); printf("transaction body pretty: \n%s\n", protoPrettyPrint.data()); diff --git a/src/cpp/tasks/SigningTransaction.h b/src/cpp/tasks/SigningTransaction.h index 30c962bf0..aaaeb9253 100644 --- a/src/cpp/tasks/SigningTransaction.h +++ b/src/cpp/tasks/SigningTransaction.h @@ -8,7 +8,7 @@ #include "../model/User.h" #include "../controller/User.h" -#include "../proto/gradido/Transaction.pb.h" +#include "../proto/gradido/GradidoTransaction.pb.h" #include "ProcessingTransaction.h" diff --git a/src/cpsp/decodeTransaction.cpsp b/src/cpsp/decodeTransaction.cpsp index d91bf4b56..109251ccb 100644 --- a/src/cpsp/decodeTransaction.cpsp +++ b/src/cpsp/decodeTransaction.cpsp @@ -12,7 +12,7 @@ %> <%% const char* pageName = "Decode Transaction"; - model::messages::gradido::TransactionBody transactionBody; + proto::gradido::TransactionBody transactionBody; bool decoded = false; bool adminUser = false; if(mSession && mSession->getNewUser()) { @@ -81,36 +81,33 @@

<%= transactionBody.memo() %>

<% if(transactionBody.has_transfer()) { auto transfer = transactionBody.transfer(); + char hex[65]; memset(hex, 0, 65); %> -

Transfer

- Sender - <% 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()); + <% if(transfer.has_local()) { + auto local_transfer = transfer.local(); + auto sender_pubkey = local_transfer.sender().pubkey(); + auto receiver_pubkey = local_transfer.receiver(); + sodium_bin2hex(hex, 65, (const unsigned char*)sender_pubkey.data(), sender_pubkey.size()); %> -

pubkey: <%= hex %>

-

amount: <%= TransactionBase::amountToString(sender.amount()) %> GDD

- <% } %> - Receiver - <% 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()); - %> -

pubkey: <%= hex %>

-

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

- <% } %> +

Local Transfer

+ From: <%= hex %> + <% sodium_bin2hex(hex, 65, (const unsigned char*)receiver_pubkey.data(), receiver_pubkey.size()); %> + To: <%= hex %> + Amount: <%= TransactionBase::amountToString(local_transfer.sender().amount()) %> + <% } else { %> +

- Not implemented yet (Group Transfer) -

+ <% } %> + <% } else if(transactionBody.has_creation()) { auto creation = transactionBody.creation(); - auto receiver = creation.receiveramount(); + auto receiver = creation.receiver(); char hex[65]; memset(hex, 0, 65); - sodium_bin2hex(hex, 65, (const unsigned char*)receiver.ed25519_receiver_pubkey().data(), receiver.ed25519_receiver_pubkey().size()); + sodium_bin2hex(hex, 65, (const unsigned char*)receiver.pubkey().data(), receiver.pubkey().size()); Poco::AutoPtr user = nullptr; if(adminUser) { user = controller::User::create(); - if(!user->load((const unsigned char*)receiver.ed25519_receiver_pubkey().data())) { + if(!user->load((const unsigned char*)receiver.pubkey().data())) { user.assign(nullptr); } }