adding missing files, reset Password check if already an email was send and show link for support email

This commit is contained in:
Dario 2020-01-06 17:12:22 +01:00
parent abef0b1ef1
commit 5842f21e89
19 changed files with 636 additions and 49 deletions

View File

@ -1,4 +1,5 @@
HTTPInterface/LoginPage.cpp
HTTPInterface/CheckEmailPage.cpp
HTTPInterface/ResetPassword.cpp
model/Session.cpp
model/Email.cpp

Binary file not shown.

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-12-02 10:53+0100\n"
"PO-Revision-Date: 2019-12-02 10:54+0100\n"
"POT-Creation-Date: 2020-01-06 15:18+0100\n"
"PO-Revision-Date: 2020-01-06 15:22+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en_GB\n"
@ -18,111 +18,163 @@ msgstr ""
"X-Generator: Poedit 2.2.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:71
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:87
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:77
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:93
msgid "Login"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:71
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:77
msgid "E-Mail or password isn't right, please try again!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:74
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:80
msgid "Account"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:74
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:80
msgid "E-Mail Address not checked, do you already get one?"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:87
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:93
msgid "Username and password are needed!"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:139
#: model/Session.cpp:138 model/Session.cpp:162
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:160
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:43
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:47
#: model/Session.cpp:158 model/Session.cpp:183
msgid "E-Mail"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:142
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:163
msgid "Password"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:144
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:165
msgid " Login "
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:146
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:167
msgid "You haven't any account yet? Please follow the link to create one."
msgstr "Don't have an account yet?"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:147
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp:168
msgid "Create New Account"
msgstr "Sign Up"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:92
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:97
msgid "Bitte gebe deinen E-Mail Verification Code ein:"
msgstr "Please enter your E-Mail Verification Code:"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:93
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:98
msgid "Email Verification Code"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:95
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:100
msgid "Überprüfe Code"
msgstr "Check Code"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:99
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:104
msgid "Du hast bisher keinen Code erhalten?"
msgstr "You didn't get a code yet?"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:100
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:105
msgid "E-Mail erneut zuschicken (in Arbeit)"
msgstr "Re-Send E-Mail (work in progress)"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:103
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:108
msgid "Funktioniert dein E-Mail Verification Code nicht?"
msgstr "Your E-Mail Verfication Code doesn't work?"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:104
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:109
msgid "Schicke uns eine E-Mail und wir kümmern uns darum: "
msgstr "Send us a E-Mail and we take care of it:"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:105
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkEmail.cpsp:110
msgid "E-Mail an Support schicken"
msgstr "Send E-Mail to support"
#: model/Session.cpp:130
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:43
msgid "E-Mail Adresse nicht gefunden werden oder ist nicht aktiviert."
msgstr "E-Mail not found or not activated."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:47
msgid "E-Mail Adresse nicht angegeben."
msgstr "Please give your E-Mail Address."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:52
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:63
msgid "Passphrase"
msgstr ""
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:52
msgid "Bitte wähle eine Option aus."
msgstr "Please choose one Option."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:63
msgid "Ungültige Option"
msgstr "Invalid option"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:111
msgid "Gebe bitte hier deine E-Mail Adresse an:"
msgstr "Please enter a valid email."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:113
msgid "Hast du dir deine Passphrase notiert oder gemerkt?"
msgstr "Do you memorized your passphrase?"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:117
msgid "Ja"
msgstr "Yes"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:122
msgid "Nein"
msgstr "No"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:127
msgid "Absenden"
msgstr "Send"
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:131
msgid "Dir wird eine E-Mail zugeschickt um dein Passwort zurückzusetzen."
msgstr "You get an E-Mail to reset your password."
#: F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp:133
msgid "Der Admin hat eine E-Mail bekommen und wird sich bei dir melden."
msgstr "The Admin get an E-Mail, wait on his replay."
#: model/Session.cpp:150
msgid "Vorname"
msgstr "Firstname"
#: model/Session.cpp:130 model/Session.cpp:134
#: model/Session.cpp:150 model/Session.cpp:154
msgid ""
"Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen "
"<>&;"
msgstr "Please enter your Name. At least 3 Character, without <>& and ;"
#: model/Session.cpp:134
#: model/Session.cpp:154
msgid "Nachname"
msgstr "Lastname"
#: model/Session.cpp:138
#: model/Session.cpp:158
msgid "Bitte gebe eine g&uuml;ltige E-Mail Adresse an."
msgstr "Please enter a valid email."
#: model/Session.cpp:162
#: model/Session.cpp:183
msgid "F&uuml;r diese E-Mail Adresse gibt es bereits einen Account"
msgstr "This email has an account already."
#: model/Session.cpp:210
msgid "Gradido: E-Mail Verification"
msgstr ""
#: model/Session.cpp:281 model/Session.cpp:288 model/Session.cpp:560
#: model/Session.cpp:318 model/Session.cpp:323 model/Session.cpp:375
#: model/Session.cpp:718
msgid "E-Mail Verification"
msgstr ""
#: model/Session.cpp:281
#: model/Session.cpp:318
msgid "Du hast dein Konto bereits aktiviert!"
msgstr "You already activated your account!"
#: model/Session.cpp:323
msgid ""
"Der Code stimmt nicht, bitte &uuml;berpr&uuml;fe ihn nochmal oder "
"registriere dich erneut oder wende dich an den Server-Admin"
@ -130,24 +182,28 @@ msgstr ""
"The email verification code isn't correct. Please check at spell errors and "
"try again or ask the server admin."
#: model/Session.cpp:288
#: model/Session.cpp:375
msgid "Falscher Code f&uuml;r aktiven Login"
msgstr "Wrong Code for active Login."
#: model/Session.cpp:421 model/Session.cpp:675
#: model/Session.cpp:572 model/Session.cpp:578 model/Session.cpp:834
msgid "Benutzer"
msgstr "User"
#: model/Session.cpp:421
#: model/Session.cpp:572
msgid "Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus."
msgstr "Couldn't connect to the community server, send E-Mail to admin."
#: model/Session.cpp:578
msgid ""
"Fehler beim L&ouml;schen des Accounts. Bitte logge dich erneut ein und "
"versuche es nochmal."
msgstr "Error by deleting the account. Please re-login and try again."
#: model/Session.cpp:560
#: model/Session.cpp:718
msgid "Konnte keinen passenden Account finden."
msgstr "This Account didn't seem to exist."
#: model/Session.cpp:675
#: model/Session.cpp:834
msgid "Kein g&uuml;ltiger Benutzer, bitte logge dich erneut ein."
msgstr "Invalid User, please re-login."

View File

@ -4,7 +4,9 @@
#include "../ServerConfig.h"
const Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9_-]*)?/(en|de)");
//const Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9_-]*)?/(en|de)");
// detect also lang field from form get
const Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9_-]*)?(?:/(en|de)|\\?.*lang=(en|de))");
Languages PageRequestMessagedHandler::chooseLanguage(Poco::Net::HTTPServerRequest& request, std::string lang_btn /*= ""*/)
{

View File

@ -0,0 +1,345 @@
#include "ResetPassword.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTMLForm.h"
#include "Poco/DeflatingStream.h"
#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
#include "../SingletonManager/LanguageManager.h"
#include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/EmailManager.h"
#include "../controller/User.h"
enum PageState {
PAGE_ASK,
PAGE_WAIT_EMAIL,
PAGE_WAIT_ADMIN,
PAGE_EMAIL_ALREADY_SEND
};
#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
#include "../ServerConfig.h"
void ResetPassword::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 19 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
PageState state = PAGE_ASK;
auto lm = LanguageManager::getInstance();
auto sm = SessionManager::getInstance();
auto adminReceiver = EmailManager::getInstance()->getAdminReceiver();
const char* pageName = "Passwort vergessen";
auto lang = chooseLanguage(request);
// class="btn btn-outline-secondary flag-btn"
// class="btn btn-secondary disabled flag-btn" disabled
std::string eng_btn_classes = "";
std::string de_btn_classes = "";
auto langCatalog = lm->getFreeCatalog(lang);
std::string emailInputClass = "form-control";
std::string passphraseRadioClass = "group";
std::string email = "";
if(!form.empty()) {
auto session = sm->getNewSession();
email = form.get("email", "");
auto passphraseMemorized = form.get("passphrase_memorized", "");
auto user = controller::User::create();
if(email != "") {
if(!user->getModel()->loadFromDB("email", email) || !user->getModel()->isEmailChecked()) {
//if(!session->ifUserExist(email)) {
//printf("user: %s\n", user->getModel()->toString().data());
addError(new Error(langCatalog->gettext("E-Mail"), langCatalog->gettext("E-Mail Adresse nicht gefunden werden oder ist nicht aktiviert.")));
emailInputClass += " is-invalid";
}
} else {
addError(new Error(langCatalog->gettext("E-Mail"), langCatalog->gettext("E-Mail Adresse nicht angegeben.")));
emailInputClass += " is-invalid";
}
if(errorCount() < 1 && passphraseMemorized == "") {
addError(new Error(langCatalog->gettext("Passphrase"), langCatalog->gettext("Bitte w&auml;hle eine Option aus.")));
passphraseRadioClass += " group-is-invalid";
}
if(errorCount() == 0) {
if(passphraseMemorized == "true") {
auto result = session->resetPassword(user, true);
if(result == 1) {
state = PAGE_EMAIL_ALREADY_SEND;
} else if(result == 0) {
state = PAGE_WAIT_EMAIL;
}
} else if(passphraseMemorized == "false") {
session->resetPassword(user, false);
state = PAGE_WAIT_ADMIN;
} else {
addError(new Error(langCatalog->gettext("Passphrase"), langCatalog->gettext("Ung&uuml;ltige Option")));
}
}
//printf("\npassphrase memorized result: %s\n", passphraseMemorized.data());
}
std::ostream& _responseStream = response.send();
Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
responseStream << "\n";
// begin include login_header.cpsp
// begin include header.cpsp
responseStream << "\n";
responseStream << "<!DOCTYPE html>\n";
responseStream << "<html>\n";
responseStream << "<head>\n";
responseStream << "<meta charset=\"UTF-8\">\n";
responseStream << "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n";
responseStream << "<title>Gradido Login Server: ";
#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( pageName );
responseStream << "</title>\n";
responseStream << "<link rel=\"stylesheet\" type=\"text/css\" href=\"";
#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "css/loginServer/style.css\">\n";
responseStream << "</head>\n";
responseStream << "<body class=\"header-fixed\">\n";
responseStream << "<div class=\"versionstring dev-info\">\n";
responseStream << "\t<p class=\"grd_small\">Login Server in Entwicklung</p>\n";
responseStream << "\t<p class=\"grd_small\">Alpha ";
#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_versionString );
responseStream << "</p>\n";
responseStream << "</div>\n";
responseStream << "<!--<nav class=\"grd-left-bar expanded\" data-topbar role=\"navigation\">\n";
responseStream << "\t<div class=\"grd-left-bar-section\">\n";
responseStream << "\t\t<ul class=\"grd-no-style\">\n";
responseStream << "\t\t <li><a href=\"";
#line 20 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"grd-nav-bn\">Startseite</a>\n";
responseStream << "\t\t <li><a href=\"./account/logout\" class=\"grd-nav-bn\">Logout</a></li>\n";
responseStream << "\t\t</ul>\n";
responseStream << "\t</div>\n";
responseStream << "</nav>-->";
// end include header.cpsp
responseStream << "\n";
responseStream << "<div class=\"authentication-theme auth-style_1\">\n";
responseStream << " <div class=\"row\">\n";
responseStream << " <div class=\"col-12 logo-section\">\n";
responseStream << " <a href=\"";
#line 5 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "\" class=\"logo\">\n";
responseStream << " <picture>\n";
responseStream << "\t\t\t\t<source srcset=\"";
#line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.webp\" type=\"image/webp\">\n";
responseStream << "\t\t\t\t<source srcset=\"";
#line 8 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" type=\"image/png\"> \n";
responseStream << "\t\t\t\t<img src=\"";
#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp"
responseStream << ( ServerConfig::g_php_serverPath );
responseStream << "img/logo_schrift.png\" alt=\"logo\" />\n";
responseStream << "\t\t\t</picture>\n";
responseStream << " </a>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"row\">\n";
responseStream << " <div class=\"col-lg-5 col-md-7 col-sm-9 col-11 mx-auto\">\n";
responseStream << " <div class=\"grid\">\n";
responseStream << " <div class=\"center-ul-container\">\n";
responseStream << " ";
#line 18 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp"
responseStream << ( getErrorsHtml() );
responseStream << "\n";
responseStream << " </div>\n";
responseStream << " <div class=\"grid-body\">";
// end include login_header.cpsp
responseStream << "\n";
responseStream << "<style type=\"text/css\">\n";
responseStream << ".group {\n";
responseStream << "\tpadding-left:10px;\n";
responseStream << "\tpadding-top:10px;\n";
responseStream << "\tpadding-bottom:10px;\n";
responseStream << "}\n";
responseStream << ".group-is-invalid {\n";
responseStream << "\tbackground-color: rgba(240,130,95,.2);\n";
responseStream << "\t border-color:#dc3545;\n";
responseStream << "\t padding-right:calc(1.5em + .75rem);\n";
responseStream << "\t background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n";
responseStream << "\t background-repeat:no-repeat;\n";
responseStream << "\t background-position:center right calc(.375em + .1875rem);\n";
responseStream << "\t background-size:calc(.75em + .375rem) calc(.75em + .375rem)\n";
responseStream << "}\n";
responseStream << ".group-is-invalid .radio label .input-frame::before {\n";
responseStream << "\tborder-color:red;\n";
responseStream << "}\n";
responseStream << "\n";
responseStream << "</style>\n";
responseStream << "\t";
#line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
if(state == PAGE_ASK) { responseStream << "\n";
responseStream << "\t\t<form action=\"";
#line 105 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( ServerConfig::g_serverPath );
responseStream << "/resetPassword\">\n";
responseStream << "\t\t\t";
// begin include flags.cpsp
responseStream << "<div class=\"row pull-right-row\">\n";
responseStream << " <div class=\"equel-grid pull-right\">\n";
responseStream << "\t<div class=\"grid-body-small text-center\">\n";
responseStream << "\t\t<button id=\"flag-england\" name=\"lang\" value=\"en\" title=\"English\" type=\"submit\" ";
#line 4 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
if(lang != LANG_EN) { responseStream << "class=\"btn btn-outline-secondary flag-btn\"";
#line 4 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
}
else { responseStream << "class=\"btn btn-secondary disabled flag-btn\" disabled";
#line 5 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
} responseStream << ">\n";
responseStream << "\t\t <span class=\"flag-england\"></span>\n";
responseStream << "\t\t</button>\n";
responseStream << "\t</div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"equel-grid pull-right\">\n";
responseStream << "\t<div class=\"grid-body-small text-center\">\n";
responseStream << "\t\t<button id=\"flag-germany\" name=\"lang\" value=\"de\" title=\"Deutsch\" type=\"submit\" ";
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
if(lang != LANG_DE) { responseStream << "class=\"btn btn-outline-secondary flag-btn\"";
#line 12 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
}
else { responseStream << "class=\"btn btn-secondary disabled flag-btn\" disabled";
#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\flags.cpsp"
} responseStream << ">\n";
responseStream << "\t\t <span class=\"flag-germany\"></span>\n";
responseStream << "\t\t</button>\n";
responseStream << "\t</div>\n";
responseStream << " </div>\n";
responseStream << "</div>";
// end include flags.cpsp
responseStream << "\n";
responseStream << "\t\t\t<div class=\"item-wrapper\">\n";
responseStream << "\t\t\t <div class=\"form-group\">\n";
responseStream << "\t\t\t\t<label for=\"email\">";
#line 109 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Gebe bitte hier deine E-Mail Adresse an:") );
responseStream << "&nbsp;&nbsp;&nbsp;&nbsp;</label>\n";
responseStream << "\t\t\t\t<input type=\"text\" class=\"";
#line 110 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( emailInputClass );
responseStream << "\" name=\"email\" id=\"email\" placeholder=\"E-Mail\" value=\"";
#line 110 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( email );
responseStream << "\">\n";
responseStream << "\t\t\t\t<label>";
#line 111 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Hast du dir deine Passphrase notiert oder gemerkt?") );
responseStream << "</label> \n";
responseStream << "\t\t\t\t<div class=\"";
#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( passphraseRadioClass );
responseStream << "\">\n";
responseStream << "\t\t\t\t\t<div class=\"radio\">\n";
responseStream << "\t\t\t\t\t <label class=\"radio-label mr-4\">\n";
responseStream << "\t\t\t\t\t\t<input name=\"passphrase_memorized\" onclick=\"removeGroupInvalidClass()\" type=\"radio\" value=\"true\">";
#line 115 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Ja") );
responseStream << " <i class=\"input-frame\"></i>\n";
responseStream << "\t\t\t\t\t </label>\n";
responseStream << "\t\t\t\t\t</div>\n";
responseStream << "\t\t\t\t\t<div class=\"radio\">\n";
responseStream << "\t\t\t\t\t <label class=\"radio-label\">\n";
responseStream << "\t\t\t\t\t\t<input name=\"passphrase_memorized\" onclick=\"removeGroupInvalidClass()\" type=\"radio\" value=\"false\">";
#line 120 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Nein") );
responseStream << " <i class=\"input-frame\"></i>\n";
responseStream << "\t\t\t\t\t </label>\n";
responseStream << "\t\t\t\t\t</div>\n";
responseStream << "\t\t\t\t</div>\n";
responseStream << "\t\t\t </div>\n";
responseStream << "\t\t\t <button type=\"submit\" class=\"btn btn-sm btn-primary\">";
#line 125 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Absenden") );
responseStream << "</button>\n";
responseStream << "\t\t\t</div>\n";
responseStream << "\t\t</form>\n";
responseStream << "\t ";
#line 128 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
} else if(state == PAGE_WAIT_EMAIL) { responseStream << "\n";
responseStream << "\t\t\t";
#line 129 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Dir wird eine E-Mail zugeschickt um dein Passwort zur&uuml;ckzusetzen.") );
responseStream << "\n";
responseStream << "\t ";
#line 130 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
} else if(state == PAGE_WAIT_ADMIN) { responseStream << "\n";
responseStream << "\t\t\t";
#line 131 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Der Admin hat eine E-Mail bekommen und wird sich bei dir melden.") );
responseStream << "\n";
responseStream << "\t ";
#line 132 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
} else if(state == PAGE_EMAIL_ALREADY_SEND) { responseStream << "\n";
responseStream << "\t\t\t<p>";
#line 133 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Du hast bereits eine E-Mail bekommen. Bitte schau auch in dein Spam-Verzeichnis nach. ") );
responseStream << "</p>\n";
responseStream << "\t\t\t<p>";
#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("Du hast wirklich keine E-Mail erhalten und auch schon ein paar Minuten gewartet?") );
responseStream << "</p>\n";
responseStream << "\t\t\t<p><b><a href=\"mailto:";
#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( adminReceiver );
responseStream << "?subject=Error Reset Password email&amp;body=Hallo Dario,%0D%0A%0D%0Aich habe keine Passwort zurücksetzen E-Mail erhalten,%0D%0Akannst du das prüfen?%0D%0A%0D%0AMit freundlichen Grüßen%0D%0A\">";
#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
responseStream << ( langCatalog->gettext("E-Mail an Support schicken"));
responseStream << "</a></b></p>\n";
responseStream << "\t ";
#line 136 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp"
} responseStream << "\n";
responseStream << " </div> \n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << " <div class=\"auth_footer\">\n";
responseStream << " <p class=\"text-muted text-center\">© Gradido 2019</p>\n";
responseStream << " </div>\n";
responseStream << " </div>\n";
responseStream << "\t<script type=\"text/javascript\">\n";
responseStream << "\t\tfunction removeGroupInvalidClass() {\n";
responseStream << "\t\t\tvar elements = document.getElementsByClassName(\"group-is-invalid\");\n";
responseStream << "\t\t\telements[0].classList.remove(\"group-is-invalid\");\n";
responseStream << "\t\t}\n";
responseStream << "\t</script>\n";
// begin include footer.cpsp
responseStream << "\t<div class=\"grd-time-used dev-info\">\n";
responseStream << "\t\t\t";
#line 2 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp"
responseStream << ( mTimeProfiler.string() );
responseStream << "\n";
responseStream << "\t</div>\n";
responseStream << "</body>\n";
responseStream << "</html>";
// end include footer.cpsp
responseStream << "\n";
if (_compressResponse) _gzipStream.close();
}

View File

@ -0,0 +1,18 @@
#ifndef ResetPassword_INCLUDED
#define ResetPassword_INCLUDED
#include "Poco/Net/HTTPRequestHandler.h"
#include "PageRequestMessagedHandler.h"
class ResetPassword: public PageRequestMessagedHandler
{
public:
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
};
#endif // ResetPassword_INCLUDED

View File

@ -0,0 +1,7 @@
#include "SessionHTTPRequestHandler.h"

View File

@ -14,6 +14,11 @@ namespace controller {
static Poco::AutoPtr<EmailVerificationCode> create(int user_id, model::table::EmailOptInType type = model::table::EMAIL_OPT_IN_REGISTER);
static Poco::AutoPtr<EmailVerificationCode> create(model::table::EmailOptInType type = model::table::EMAIL_OPT_IN_REGISTER);
inline size_t load(Poco::UInt64 code) { return getModel()->loadFromDB("verification_code", code); }
inline size_t load(int user_id, model::table::EmailOptInType type) {
std::vector<std::string> fields = { "user_id", "email_opt_in_type_id"};
return getModel()->loadFromDB(fields, user_id, (int)type);
}
inline Poco::AutoPtr<model::table::EmailOptIn> getModel() { return _getModel<model::table::EmailOptIn>(); }
std::string getLink();

View File

@ -383,11 +383,17 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode)
}
bool Session::resetPassword(Poco::AutoPtr<controller::User> user, bool passphraseMemorized)
int Session::resetPassword(Poco::AutoPtr<controller::User> user, bool passphraseMemorized)
{
mNewUser = user;
if (passphraseMemorized) {
// first check if already exist
mEmailVerificationCodeObject = controller::EmailVerificationCode::create(mNewUser->getModel()->getID(), model::table::EMAIL_OPT_IN_RESET_PASSWORD);
auto foundCount = mEmailVerificationCodeObject->load(user->getModel()->getID(), model::table::EMAIL_OPT_IN_RESET_PASSWORD);
if (foundCount) {
return 1;
}
auto emailVerificationModel = mEmailVerificationCodeObject->getModel();
UniLib::controller::TaskPtr insertEmailVerificationCode(
new model::table::ModelInsertTask(emailVerificationModel, true)
@ -404,7 +410,7 @@ bool Session::resetPassword(Poco::AutoPtr<controller::User> user, bool passphras
EmailManager::getInstance()->addEmail(new model::Email(user, model::EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE));
}
return true;
return 0;
}
bool Session::startProcessingTransaction(const std::string& proto_message_base64)

View File

@ -91,7 +91,9 @@ public:
int updateEmailVerification(Poco::UInt64 emailVerificationCode);
// called from page with same name
bool resetPassword(Poco::AutoPtr<controller::User> user, bool passphraseMemorized);
//! \return 1 = reset password email already send
//! \return 0 = ok
int resetPassword(Poco::AutoPtr<controller::User> user, bool passphraseMemorized);
Poco::Net::HTTPCookie getLoginCookie();

View File

@ -36,8 +36,8 @@ namespace model {
lock();
insert << "INSERT INTO " << getTableName()
<< " (user_id, verification_code, email_opt_in_type_id) VALUES(?,?,?))"
, bind(mUserId), bind(mEmailVerificationCode), bind(mType);
<< " (user_id, verification_code, email_opt_in_type_id) VALUES(?,?,?)"
, use(mUserId), use(mEmailVerificationCode), bind(mType);
unlock();
return insert;
}
@ -47,12 +47,40 @@ namespace model {
{
Poco::Data::Statement select(session);
int iType = 0;
select << "SELECT user_id, verification_code, email_opt_in_type_id FROM " << getTableName()
<< " where " << fieldName << " = ?"
, into(mUserId), into(mEmailVerificationCode), into(iType);
, into(mUserId), into(mEmailVerificationCode), into(mType);
return select;
}
Poco::Data::Statement EmailOptIn::_loadFromDB(Poco::Data::Session session, const std::vector<std::string>& fieldNames, MysqlConditionType conditionType/* = MYSQL_CONDITION_AND*/)
{
Poco::Data::Statement select(session);
if (fieldNames.size() <= 1) {
throw Poco::NullValueException("EmailOptIn::_loadFromDB fieldNames empty or contain only one field");
}
select << "SELECT user_id, verification_code, email_opt_in_type_id FROM " << getTableName()
<< " where " << fieldNames[0] << " = ? ";
if (conditionType == MYSQL_CONDITION_AND) {
for (int i = 1; i < fieldNames.size(); i++) {
select << " AND " << fieldNames[i] << " = ? ";
}
}
else if (conditionType == MYSQL_CONDITION_OR) {
for (int i = 1; i < fieldNames.size(); i++) {
select << " OR " << fieldNames[i] << " = ? ";
}
}
else {
addError(new ParamError("EmailOptIn::_loadFromDB", "condition type not implemented", conditionType));
}
//<< " where " << fieldName << " = ?"
select , into(mUserId), into(mEmailVerificationCode), into(mType);
mType = static_cast<EmailOptInType>(iType);
return select;
}
@ -62,7 +90,7 @@ namespace model {
std::stringstream ss;
ss << "code: " << mEmailVerificationCode << std::endl;
ss << "user_id: " << mUserId << std::endl;
ss << "type: " << typeToString(mType) << std::endl;
ss << "type: " << typeToString(static_cast<EmailOptInType>(mType)) << std::endl;
return ss.str();
}

View File

@ -32,12 +32,13 @@ namespace model {
static const char* typeToString(EmailOptInType type);
protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::vector<std::string>& fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND);
Poco::Data::Statement _insertIntoDB(Poco::Data::Session session);
// data type must be a multiple of 4
Poco::UInt64 mEmailVerificationCode;
int mUserId;
EmailOptInType mType;
int mType;
};

View File

@ -80,6 +80,13 @@ namespace model {
}
Poco::Data::Statement ModelBase::_loadFromDB(Poco::Data::Session session, const std::vector<std::string>& fieldNames, MysqlConditionType conditionType/* = MYSQL_CONDITION_AND*/)
{
std::string message = getTableName();
message += "::_loadFromDB with multiple fields not implemented";
throw Poco::Exception(message);
}
Poco::DateTime ModelBase::parseElopageDate(std::string dateString)
{
std::string decodedDateString = "";

View File

@ -14,6 +14,11 @@
namespace model {
namespace table {
enum MysqlConditionType {
MYSQL_CONDITION_AND,
MYSQL_CONDITION_OR
};
class ModelBase : public UniLib::lib::MultithreadContainer, public ErrorList
{
public:
@ -26,6 +31,7 @@ namespace model {
template<class T> size_t updateIntoDB(const std::string& fieldName, const T& fieldValue );
template<class T> size_t loadFromDB(const std::string& fieldName, const T& fieldValue);
template<class T1, class T2> size_t loadFromDB(const std::vector<std::string>& fieldNames, const T1& field1Value, const T2& field2Value, MysqlConditionType conditionType = MYSQL_CONDITION_AND);
bool insertIntoDB();
inline void setID(int id) { lock(); mID = id; unlock(); }
@ -39,6 +45,7 @@ namespace model {
protected:
virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName) = 0;
virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::vector<std::string>& fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND);
virtual Poco::Data::Statement _insertIntoDB(Poco::Data::Session session) = 0;
int mID;
@ -68,6 +75,31 @@ namespace model {
return resultCount;
}
template<class T1, class T2>
size_t ModelBase::loadFromDB(const std::vector<std::string>& fieldNames, const T1& field1Value, const T2& field2Value, MysqlConditionType conditionType/* = MYSQL_CONDITION_AND*/)
{
auto cm = ConnectionManager::getInstance();
Poco::Data::Statement select = _loadFromDB(cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER), fieldNames, conditionType);
select, Poco::Data::Keywords::useRef(field1Value), Poco::Data::Keywords::useRef(field2Value);
size_t resultCount = 0;
try {
resultCount = select.execute();
}
catch (Poco::Exception& ex) {
lock();
addError(new ParamError(getTableName(), "mysql error by selecting", ex.displayText().data()));
for (auto it = fieldNames.begin(); it != fieldNames.end(); it++) {
addError(new ParamError(getTableName(), "field name for select: ", it->data()));
}
//addError(new ParamError(getTableName(), "field name for select: ", fieldName.data()));
unlock();
}
return resultCount;
}
template<class T>
size_t ModelBase::updateIntoDB(const std::string& fieldName, const T& fieldValue)
{

View File

@ -0,0 +1,38 @@
#include "TestRegExp.h"
#include "Poco/RegularExpression.h"
#include "Poco/Exception.h"
// Poco::RegularExpression PageRequestMessagedHandler::mDetectLanguageGET("^(?:/[a-zA-Z0-9_-]*)?(?:/(en|de)|\?.*lang=(en|de))");
TestRegExp::TestRegExp()
{
}
TestRegExp::~TestRegExp()
{
}
//! \return 0 if init okay, else return != 0
int TestRegExp::init()
{
try {
Poco::RegularExpression detectLanguageGet("^(?:/[a-zA-Z0-9_-]*)?(?:/(en|de)|\\?.*lang=(en|de))");
std::vector<std::string> matches;
detectLanguageGet.split("/resetPassword?lang=en&email=", matches);
int zahl = 0;
}
catch (Poco::RegularExpressionException& ex) {
printf("regular expression exception: %s\n", ex.displayText().data());
return -1;
}
return 0;
}
//! \return 0 if okay, else return != 0
int TestRegExp::test()
{
return 0;
}

19
src/cpp/test/TestRegExp.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef __GRADIDO_LOGIN_SERVER_TEST_REG_EXP_
#define __GRADIDO_LOGIN_SERVER_TEST_REG_EXP_
#include "Test.h"
class TestRegExp : public Test
{
public:
TestRegExp();
~TestRegExp();
//! \return 0 if init okay, else return != 0
int init();
//! \return 0 if okay, else return != 0
int test();
const char* getName() { return "TestRegExp"; };
};
#endif //__GRADIDO_LOGIN_SERVER_TEST_REG_EXP_

View File

@ -8,6 +8,7 @@ void fillTests()
{
gTests.push_back(new TestTasks());
gTests.push_back(new TestHash());
gTests.push_back(new TestRegExp());
// gTests.push_back(new LoginTest());
}

View File

@ -1,3 +1,4 @@
#include "TestTasks.h"
#include "TestHash.h"
#include "TestRegExp.h"

18
src/cpsp/flags.cpsp Normal file
View File

@ -0,0 +1,18 @@
<div class="row pull-right-row">
<div class="equel-grid pull-right">
<div class="grid-body-small text-center">
<button id="flag-england" name="lang" value="en" title="English" type="submit" <% if(lang != LANG_EN) { %>class="btn btn-outline-secondary flag-btn"<% }
else { %>class="btn btn-secondary disabled flag-btn" disabled<% } %>>
<span class="flag-england"></span>
</button>
</div>
</div>
<div class="equel-grid pull-right">
<div class="grid-body-small text-center">
<button id="flag-germany" name="lang" value="de" title="Deutsch" type="submit" <% if(lang != LANG_DE) { %>class="btn btn-outline-secondary flag-btn"<% }
else { %>class="btn btn-secondary disabled flag-btn" disabled<% } %>>
<span class="flag-germany"></span>
</button>
</div>
</div>
</div>