mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
153 lines
5.2 KiB
C++
153 lines
5.2 KiB
C++
#include "JsonSendEmail.h"
|
|
|
|
#include "Poco/URI.h"
|
|
|
|
#include "../SingletonManager/SessionManager.h"
|
|
#include "../SingletonManager/EmailManager.h"
|
|
#include "../SingletonManager/LanguageManager.h"
|
|
|
|
#include "../controller/User.h"
|
|
#include "../controller/EmailVerificationCode.h"
|
|
|
|
#include "../lib/DataTypeConverter.h"
|
|
|
|
Poco::JSON::Object* JsonSendEmail::handle(Poco::Dynamic::Var params)
|
|
{
|
|
int session_id = 0;
|
|
std::string email;
|
|
model::EmailType emailType = model::EMAIL_DEFAULT;
|
|
model::table::EmailOptInType emailVerificationCodeType;
|
|
std::string emailCustomText;
|
|
std::string emailCustomSubject;
|
|
std::string languageCode;
|
|
|
|
std::string email_verification_code_type_string;
|
|
std::string email_type_string;
|
|
int email_type_int = 0;
|
|
|
|
// if is json object
|
|
if (params.type() == typeid(Poco::JSON::Object::Ptr)) {
|
|
Poco::JSON::Object::Ptr paramJsonObject = params.extract<Poco::JSON::Object::Ptr>();
|
|
/// 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 {
|
|
|
|
if (paramJsonObject->has("session_id")) {
|
|
paramJsonObject->get("session_id").convert(session_id);
|
|
}
|
|
|
|
if (paramJsonObject->has("email_custom_text")) {
|
|
paramJsonObject->get("email_custom_text").convert(emailCustomText);
|
|
}
|
|
if (paramJsonObject->has("email_custom_subject")) {
|
|
paramJsonObject->get("email_custom_subject").convert(emailCustomSubject);
|
|
}
|
|
if (paramJsonObject->has("language")) {
|
|
paramJsonObject->get("language").convert(languageCode);
|
|
}
|
|
paramJsonObject->get("email").convert(email);
|
|
|
|
paramJsonObject->get("email_verification_code_type").convert(email_verification_code_type_string);
|
|
auto email_text = paramJsonObject->get("email_text");
|
|
if (email_text.isString()) {
|
|
email_text.convert(email_type_string);
|
|
}
|
|
else if (email_text.isInteger()) {
|
|
email_text.convert(email_type_int);
|
|
}
|
|
|
|
}
|
|
catch (Poco::Exception& ex) {
|
|
return stateError("json exception", ex.displayText());
|
|
}
|
|
}
|
|
// convert types into enum
|
|
if (email_type_int > 0 && email_type_int < model::EMAIL_MAX) {
|
|
emailType = (model::EmailType)email_type_int;
|
|
}
|
|
else if (email_type_string != "") {
|
|
emailType = model::Email::emailType(email_type_string);
|
|
}
|
|
emailVerificationCodeType = model::table::EmailOptIn::stringToType(email_verification_code_type_string);
|
|
if (model::table::EMAIL_OPT_IN_EMPTY == emailVerificationCodeType) {
|
|
return stateError("invalid verification code type");
|
|
}
|
|
|
|
switch (emailType) {
|
|
case model::EMAIL_DEFAULT:
|
|
case model::EMAIL_ERROR:
|
|
case model::EMAIL_MAX: return stateError("invalid email type");
|
|
}
|
|
|
|
if (0 == session_id &&
|
|
(model::table::EMAIL_OPT_IN_REGISTER == emailVerificationCodeType || model::table::EMAIL_OPT_IN_REGISTER_DIRECT == emailVerificationCodeType)
|
|
){
|
|
return stateError("login needed");
|
|
}
|
|
|
|
auto sm = SessionManager::getInstance();
|
|
auto em = EmailManager::getInstance();
|
|
auto lm = LanguageManager::getInstance();
|
|
|
|
Session* session = nullptr;
|
|
if (session_id != 0) {
|
|
session = sm->getSession(session_id);
|
|
if (nullptr == session) {
|
|
return stateError("invalid session");
|
|
}
|
|
}
|
|
Poco::Thread::sleep(ServerConfig::g_FakeLoginSleepTime);
|
|
auto receiver_user = controller::User::create();
|
|
if (1 != receiver_user->load(email)) {
|
|
return stateSuccess();
|
|
}
|
|
auto receiver_user_id = receiver_user->getModel()->getID();
|
|
std::string linkInEmail = "";
|
|
if (emailVerificationCodeType == model::table::EMAIL_OPT_IN_RESET_PASSWORD)
|
|
{
|
|
linkInEmail = receiver_user->getGroupBaseUrl() + ServerConfig::g_frontend_resetPasswordPath;
|
|
session = sm->getNewSession();
|
|
if (emailType == model::EMAIL_USER_RESET_PASSWORD) {
|
|
auto r = session->sendResetPasswordEmail(receiver_user, true, linkInEmail);
|
|
if (1 == r) {
|
|
return stateWarning("email already sended");
|
|
}
|
|
else if (2 == r) {
|
|
return stateError("email already sent less than a 10 minutes before");
|
|
}
|
|
}
|
|
else if (emailType == model::EMAIL_CUSTOM_TEXT) {
|
|
auto email_verification_code_object = controller::EmailVerificationCode::loadOrCreate(receiver_user_id, model::table::EMAIL_OPT_IN_RESET_PASSWORD);
|
|
email_verification_code_object->setBaseUrl(linkInEmail);
|
|
auto email = new model::Email(email_verification_code_object, receiver_user, emailCustomText, emailCustomSubject);
|
|
em->addEmail(email);
|
|
}
|
|
else {
|
|
return stateError("not supported email type");
|
|
}
|
|
return stateSuccess();
|
|
}
|
|
else
|
|
{
|
|
linkInEmail = receiver_user->getGroupBaseUrl() + ServerConfig::g_frontend_checkEmailPath;
|
|
if (session->getNewUser()->getModel()->getRole() != model::table::ROLE_ADMIN) {
|
|
return stateError("admin needed");
|
|
}
|
|
|
|
auto email_verification_code_object = controller::EmailVerificationCode::loadOrCreate(receiver_user_id, emailVerificationCodeType);
|
|
email_verification_code_object->setBaseUrl(linkInEmail);
|
|
model::Email* email = nullptr;
|
|
if (emailType == model::EMAIL_CUSTOM_TEXT) {
|
|
email = new model::Email(email_verification_code_object, receiver_user, emailCustomText, emailCustomSubject);
|
|
}
|
|
else {
|
|
email = new model::Email(email_verification_code_object, receiver_user, emailType);
|
|
}
|
|
em->addEmail(email);
|
|
return stateSuccess();
|
|
}
|
|
|
|
} |