From 458c99958f90e5df5c935805a849ce9a131f58af Mon Sep 17 00:00:00 2001 From: Dario Date: Thu, 19 Mar 2020 22:08:14 +0100 Subject: [PATCH] =?UTF-8?q?Admin=20Email=20Verification=20resend=20via=20j?= =?UTF-8?q?son=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JsonAdminEmailVerificationResend.cpp | 150 ++++++++++++++++++ .../JsonAdminEmailVerificationResend.h | 16 ++ .../JsonRequestHandlerFactory.cpp | 4 + src/cpp/SingletonManager/EmailManager.h | 1 + src/cpp/SingletonManager/MemoryManager.cpp | 1 - src/cpp/model/email/Email.cpp | 19 +++ src/cpp/model/email/Email.h | 1 + 7 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 src/cpp/JSONInterface/JsonAdminEmailVerificationResend.cpp create mode 100644 src/cpp/JSONInterface/JsonAdminEmailVerificationResend.h diff --git a/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.cpp b/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.cpp new file mode 100644 index 000000000..5e139e088 --- /dev/null +++ b/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.cpp @@ -0,0 +1,150 @@ +#include "JsonAdminEmailVerificationResend.h" + +#include "Poco/URI.h" + +#include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/EmailManager.h" + +#include "../controller/User.h" + +Poco::JSON::Object* JsonAdminEmailVerificationResend::handle(Poco::Dynamic::Var params) +{ + std::string email; + int session_id = 0; + Poco::JSON::Object* result = new Poco::JSON::Object; + bool parameterReaded = false; + // if is json object + if (params.type() == typeid(Poco::JSON::Object::Ptr)) { + Poco::JSON::Object::Ptr paramJsonObject = params.extract(); + /// Throws a RangeException if the value does not fit + /// into the result variable. + /// Throws a NotImplementedException if conversion is + /// not available for the given type. + /// Throws InvalidAccessException if Var is empty. + try { + paramJsonObject->get("email").convert(email); + paramJsonObject->get("session_id").convert(session_id); + parameterReaded = true; + } + catch (Poco::Exception& ex) { + printf("[JsonGetRunningUserTasks::handle] try to use params as jsonObject: %s\n", ex.displayText().data()); + result->set("state", "error"); + result->set("msg", "json exception"); + result->set("details", ex.displayText()); + } + } + else if (params.isStruct()) { + auto _email = params["email"]; + auto _session_id = params["session_id"]; + parameterReaded = true; + //std::string miau = params["miau"]; + } + else if (params.isVector()) { + const Poco::URI::QueryParameters queryParams = params.extract(); + for (auto it = queryParams.begin(); it != queryParams.end(); it++) { + if (it->first == "email") { + email = it->second; + break; + } + else if (it->first == "session_id") { + try { + session_id = stoi(it->second); + } + catch (const std::invalid_argument& ia) { + result->set("state", "error"); + result->set("msg", "error parsing query params, invalid argument: "); + result->set("details", ia.what()); + return result; + } + catch (const std::out_of_range& oor) { + result->set("state", "error"); + result->set("msg", "error parsing query params, Out of Range error: "); + result->set("details", oor.what()); + return result; + } + catch (const std::logic_error & ler) { + result->set("state", "error"); + result->set("msg", "error parsing query params, Logical error: "); + result->set("details", ler.what()); + return result; + } + catch (Poco::Exception& ex) { + //printf("[JsonGetLogin::handle] exception: %s\n", ex.displayText().data()); + result->set("state", "error"); + result->set("msg", "error parsing query params, Poco Error"); + result->set("details", ex.displayText()); + return result; + } + } + } + parameterReaded = true; + } + else if (params.isArray()) { + result->set("state", "error"); + result->set("msg", "array not implemented yet"); + } + else if (params.isList()) { + result->set("state", "error"); + result->set("msg", "list not implemented yet"); + } + else if (params.isString()) { + result->set("state", "error"); + result->set("msg", "string not implemented yet"); + } + else if (params.isDeque()) { + result->set("state", "error"); + result->set("msg", "deque not implemented yet"); + } + else { + result->set("state", "error"); + result->set("msg", "format not implemented"); + result->set("details", std::string(params.type().name())); + } + + if (parameterReaded && email != "" && session_id != 0) { + auto sm = SessionManager::getInstance(); + auto em = EmailManager::getInstance(); + auto session = sm->getSession(session_id); + if (session) { + auto user = session->getNewUser(); + if (!user.isNull()) { + auto userModel = user->getModel(); + if (userModel->getRole() == model::table::ROLE_ADMIN) { + auto receiverUser = controller::User::create(); + if (1 == receiverUser->load(email)) { + em->addEmail(new model::Email(receiverUser, model::EMAIL_ADMIN_USER_VERIFICATION_CODE_RESEND)); + result->set("state", "success"); + } + else { + result->set("state", "error"); + result->set("msg", "receiver user not found"); + } + } + else { + result->set("state", "error"); + result->set("msg", "user isn't admin"); + } + } + else { + result->set("state", "error"); + result->set("msg", "session hasn't valid user"); + } + } + else { + result->set("state", "error"); + result->set("msg", "session not found"); + } + + //result->set("runningTasks", tasksJson); + } + else if (parameterReaded) { + result->set("state", "error"); + result->set("msg", "empty email or session_id"); + } + else { + result->set("state", "error"); + result->set("msg", "error reading parameter"); + } + + return result; +} \ No newline at end of file diff --git a/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.h b/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.h new file mode 100644 index 000000000..d882fda45 --- /dev/null +++ b/src/cpp/JSONInterface/JsonAdminEmailVerificationResend.h @@ -0,0 +1,16 @@ +#ifndef __JSON_VERIFICATION_EMAIL_RESEND_H +#define __JSON_VERIFICATION_EMAIL_RESEND_H + +#include "JsonRequestHandler.h" + +class JsonAdminEmailVerificationResend : public JsonRequestHandler +{ +public: + Poco::JSON::Object* handle(Poco::Dynamic::Var params); + +protected: + + +}; + +#endif // __JSON_VERIFICATION_EMAIL_RESEND_H \ No newline at end of file diff --git a/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp b/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp index b7ab552a9..f5ebea1b9 100644 --- a/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp +++ b/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp @@ -9,6 +9,7 @@ #include "JsonTransaction.h" #include "JsonGetRunningUserTasks.h" #include "JsonGetUsers.h" +#include "JsonAdminEmailVerificationResend.h" JsonRequestHandlerFactory::JsonRequestHandlerFactory() : mRemoveGETParameters("^/([a-zA-Z0-9_-]*)"), mLogging(Poco::Logger::get("requestLog")) @@ -39,6 +40,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c } else if (url_first_part == "/getUsers") { return new JsonGetUsers; + } + else if (url_first_part == "/adminEmailVerificationResend") { + return new JsonAdminEmailVerificationResend; } return new JsonUnknown; diff --git a/src/cpp/SingletonManager/EmailManager.h b/src/cpp/SingletonManager/EmailManager.h index 41c2319c3..87bbc676a 100644 --- a/src/cpp/SingletonManager/EmailManager.h +++ b/src/cpp/SingletonManager/EmailManager.h @@ -29,6 +29,7 @@ public: inline const std::string& getAdminReceiver() { return mEmailAccount.admin_receiver; } + //! \brief call delete on email after sending it inline void addEmail(model::Email* email) { mPendingEmails.push(email); condSignal();} protected: diff --git a/src/cpp/SingletonManager/MemoryManager.cpp b/src/cpp/SingletonManager/MemoryManager.cpp index 05cb22cad..245c9d9df 100644 --- a/src/cpp/SingletonManager/MemoryManager.cpp +++ b/src/cpp/SingletonManager/MemoryManager.cpp @@ -83,7 +83,6 @@ MemoryManager::MemoryManager() mMemoryPageStacks[2] = new MemoryPageStack(65); // pubkey hex mMemoryPageStacks[3] = new MemoryPageStack(96); // privkey encrypted mMemoryPageStacks[4] = new MemoryPageStack(161); // privkey hex - } MemoryManager::~MemoryManager() diff --git a/src/cpp/model/email/Email.cpp b/src/cpp/model/email/Email.cpp index 44f351503..b9f40f069 100644 --- a/src/cpp/model/email/Email.cpp +++ b/src/cpp/model/email/Email.cpp @@ -29,6 +29,21 @@ Mit freundlichen Grüßen\n\ Dario, Gradido Server Admin\n\ "}; +const static char EmailText_adminEmailVerificationResend[] = { u8"\ +Hallo [first_name] [last_name],\n\ +\n\ +Der Admin hat ein erneutes zusenden deiner Bestätigungsemail angefordert. \n\ +Du hast vor einer Weile ein Gradido Konto mit dieser E-Mail angelegt, aber es noch nicht bestätigt. \n\ +\n\ +Bitte klicke zur Bestätigung auf den Link: [link]\n\ +oder kopiere den obigen Link in Dein Browserfenster.\n\ +\n\ +Mit freundlichen Grüßen\n\ +Dario, Gradido Server Admin\n\ +" }; + + + const static char EmailText_emailResetPassword[] = { u8"\ Hallo [first_name] [last_name],\n\ \n\ @@ -118,6 +133,7 @@ Gradido Login-Server\n\ case EMAIL_USER_VERIFICATION_CODE: case EMAIL_ADMIN_USER_VERIFICATION_CODE: + case EMAIL_ADMIN_USER_VERIFICATION_CODE_RESEND: if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") { addError(new Error(functionName, "no receiver email set for user email verification email")); return false; @@ -133,6 +149,9 @@ Gradido Login-Server\n\ if (mType == EMAIL_ADMIN_USER_VERIFICATION_CODE) { messageTemplate = EmailText_adminEmailVerification; } + else if (mType == EMAIL_ADMIN_USER_VERIFICATION_CODE_RESEND) { + messageTemplate = EmailText_adminEmailVerificationResend; + } mailMessage->addContent( new Poco::Net::StringPartSource(replaceUserNamesAndLink( diff --git a/src/cpp/model/email/Email.h b/src/cpp/model/email/Email.h index 95cf6dac3..cc155115a 100644 --- a/src/cpp/model/email/Email.h +++ b/src/cpp/model/email/Email.h @@ -28,6 +28,7 @@ namespace model { EMAIL_ERROR, EMAIL_USER_VERIFICATION_CODE, EMAIL_ADMIN_USER_VERIFICATION_CODE, + EMAIL_ADMIN_USER_VERIFICATION_CODE_RESEND, EMAIL_USER_RESET_PASSWORD, EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE, EMAIL_NOTIFICATION_TRANSACTION_CREATION,