From 5842f21e89ffe4a2509eef5da6c9b6ed3d1b8446 Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 6 Jan 2020 17:12:22 +0100 Subject: [PATCH] adding missing files, reset Password check if already an email was send and show link for support email --- files_to_translate.txt | 1 + src/LOCALE/en_GB.mo | Bin 2385 -> 3540 bytes src/LOCALE/en_GB.po | 132 +++++-- .../PageRequestMessagedHandler.cpp | 4 +- src/cpp/HTTPInterface/ResetPassword.cpp | 345 ++++++++++++++++++ src/cpp/HTTPInterface/ResetPassword.h | 18 + .../SessionHTTPRequestHandler.cpp | 7 + src/cpp/controller/EmailVerificationCode.h | 5 + src/cpp/model/Session.cpp | 10 +- src/cpp/model/Session.h | 4 +- src/cpp/model/table/EmailOptIn.cpp | 40 +- src/cpp/model/table/EmailOptIn.h | 3 +- src/cpp/model/table/ModelBase.cpp | 7 + src/cpp/model/table/ModelBase.h | 32 ++ src/cpp/test/TestRegExp.cpp | 38 ++ src/cpp/test/TestRegExp.h | 19 + src/cpp/test/main.cpp | 1 + src/cpp/test/main.h | 1 + src/cpsp/flags.cpsp | 18 + 19 files changed, 636 insertions(+), 49 deletions(-) create mode 100644 src/cpp/HTTPInterface/ResetPassword.cpp create mode 100644 src/cpp/HTTPInterface/ResetPassword.h create mode 100644 src/cpp/HTTPInterface/SessionHTTPRequestHandler.cpp create mode 100644 src/cpp/test/TestRegExp.cpp create mode 100644 src/cpp/test/TestRegExp.h create mode 100644 src/cpsp/flags.cpsp diff --git a/files_to_translate.txt b/files_to_translate.txt index ea55234ce..845b79657 100644 --- a/files_to_translate.txt +++ b/files_to_translate.txt @@ -1,4 +1,5 @@ HTTPInterface/LoginPage.cpp HTTPInterface/CheckEmailPage.cpp +HTTPInterface/ResetPassword.cpp model/Session.cpp model/Email.cpp \ No newline at end of file diff --git a/src/LOCALE/en_GB.mo b/src/LOCALE/en_GB.mo index 9355ca30e7f7c12798161fc65dcf09bdfd621fec..adc62f7aa23cb094a9b63183786bbc9174c12bef 100644 GIT binary patch delta 1727 zcmZvbO>7%Q7>37=ojCl25-5bGg-J==(k8}9p@K9d#A!oIAyi6w2neLf?sPq}J!|dG z#mW_SHUab5%3yVKz#NGJ|KqefscWIf&0Oeu!~Rj3|Ij- zz$s+sE$|kMKOIiaeVOuW@Hpnb1INLe;1YNMo9_dk2kAZoPJ@?0jri<6d^`k>-I_SA zfDdB)BFMp4z{B7>;630MAf@>Gbp9qtrJJ~ou_wSq@ECX*Bq8sDwEr^@)nGq^_k+KI zT~b)MJqd6YggI6NDRl-s3bw!z@NE#L*j129vjZX_w!wp4BZt&b1$&0RNp!E_h;5YN zyQuyYh*VKKl)%0Na(pj31+wlydQcE;T>&<&cYt^jwuCf?WUzhc9GzTJyE}pXC4+aO z)1zj^_{YpxVRH2t z89G(v)C`Xr+{GHdAi}Wa2Znc|pcs)Rr`Cx=X*zUMWuVwS9YIHElI`bxZF~d_q%t8F zHKVqb49o;eLoB<23`5B^bQvzRCq21^oBn^@lb7HGep)gh_^u4NLag*SU7x4>OCNXx z<;+V@;V!;q6IjKxl_dFpLJK|5&RW5d%?jC+)@QRC2-4;ox-*I9$%YJSW{Ev5;x}`Z z#T6tt(#o{?x(v1vBatElICiRV(hDav!fT!siZll(Ui?k&L~acM<4k^j|3&R3DXkmj z^=cf?=U*F{E60(z7P2Q$5CSI%G3N} zlWkOG8rPGQ#!)~N2`Afr6!2#90Ni+I=umgl zkGQA@Qn+m{9AsY@=_dPx%{1T41+(#BM=wApYFxyKc ze66Kp v$elrcoPHfcTgPcm|G|I66mBElEtIosew-aXHgZmHi@JhV`$vqA4;TLi1gMIg delta 627 zcmXxgOG{fp6u|M5+@v=TZ&FiROV##T)LKo*qpdWCQcNVc5M79?uG;ikg_uZ4$Vws< z+(=eK=~r+e6k2EnyR1uvfYe>lKAm^3SLF+i<5%p%zxW(Ie5}8pW++KR zWR{8E;U3LD6@IHoFU3Vsh&u|{cu!(nZ7xjC`$R%xtQ8fG<3Zo4A{}aeQJHeSd zVX?m4Aa(mWfOL~xWDlv^86x#hbX+ItYG)B$UxhyHRj_B_pq);HF{mGmEY?d+ih z=Vn^X`nE#JbS#;QB~o@WG5O@N`s4eh4*X4XVdYK9UR+b#fvU;}d)0pMr#kDpr)I3E Ls#_1$2W$8O&V*BI diff --git a/src/LOCALE/en_GB.po b/src/LOCALE/en_GB.po index 6727c10cb..ddcfecb86 100644 --- a/src/LOCALE/en_GB.po +++ b/src/LOCALE/en_GB.po @@ -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ültige E-Mail Adresse an." msgstr "Please enter a valid email." -#: model/Session.cpp:162 +#: model/Session.cpp:183 msgid "Fü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 überprü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ü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ö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ültiger Benutzer, bitte logge dich erneut ein." msgstr "Invalid User, please re-login." diff --git a/src/cpp/HTTPInterface/PageRequestMessagedHandler.cpp b/src/cpp/HTTPInterface/PageRequestMessagedHandler.cpp index 2f1159ebd..407ab4dbf 100644 --- a/src/cpp/HTTPInterface/PageRequestMessagedHandler.cpp +++ b/src/cpp/HTTPInterface/PageRequestMessagedHandler.cpp @@ -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 /*= ""*/) { diff --git a/src/cpp/HTTPInterface/ResetPassword.cpp b/src/cpp/HTTPInterface/ResetPassword.cpp new file mode 100644 index 000000000..ee8894adb --- /dev/null +++ b/src/cpp/HTTPInterface/ResetPassword.cpp @@ -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ä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ü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 << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: "; +#line 9 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" + responseStream << ( pageName ); + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "\t

Login Server in Entwicklung

\n"; + responseStream << "\t

Alpha "; +#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" + responseStream << ( ServerConfig::g_versionString ); + responseStream << "

\n"; + responseStream << "
\n"; + responseStream << ""; + // end include header.cpsp + responseStream << "\n"; + responseStream << "
\n"; + responseStream << " \n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << " "; +#line 18 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login_header.cpsp" + responseStream << ( getErrorsHtml() ); + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "
"; + // end include login_header.cpsp + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\t"; +#line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" + if(state == PAGE_ASK) { responseStream << "\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\t"; + // begin include flags.cpsp + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t
\n"; + responseStream << "
\n"; + responseStream << "
"; + // end include flags.cpsp + responseStream << "\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t \n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t \n"; + responseStream << "\t\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t
\n"; + responseStream << "\t\t\t\t\t \n"; + responseStream << "\t\t\t\t\t
\n"; + responseStream << "\t\t\t\t
\n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t\t \n"; + responseStream << "\t\t\t
\n"; + responseStream << "\t\t
\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ü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

"; +#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 << "

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

"; +#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 << "

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

"; +#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" + responseStream << ( langCatalog->gettext("E-Mail an Support schicken")); + responseStream << "

\n"; + responseStream << "\t "; +#line 136 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\resetPassword.cpsp" + } responseStream << "\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "

© Gradido 2019

\n"; + responseStream << "
\n"; + responseStream << "
\n"; + responseStream << "\t\n"; + // begin include footer.cpsp + responseStream << "\t
\n"; + responseStream << "\t\t\t"; +#line 2 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" + responseStream << ( mTimeProfiler.string() ); + responseStream << "\n"; + responseStream << "\t
\n"; + responseStream << "\n"; + responseStream << ""; + // end include footer.cpsp + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/ResetPassword.h b/src/cpp/HTTPInterface/ResetPassword.h new file mode 100644 index 000000000..639022270 --- /dev/null +++ b/src/cpp/HTTPInterface/ResetPassword.h @@ -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 diff --git a/src/cpp/HTTPInterface/SessionHTTPRequestHandler.cpp b/src/cpp/HTTPInterface/SessionHTTPRequestHandler.cpp new file mode 100644 index 000000000..d728a2efa --- /dev/null +++ b/src/cpp/HTTPInterface/SessionHTTPRequestHandler.cpp @@ -0,0 +1,7 @@ +#include "SessionHTTPRequestHandler.h" + + + + + + diff --git a/src/cpp/controller/EmailVerificationCode.h b/src/cpp/controller/EmailVerificationCode.h index 8b94d06bb..fb6689c71 100644 --- a/src/cpp/controller/EmailVerificationCode.h +++ b/src/cpp/controller/EmailVerificationCode.h @@ -14,6 +14,11 @@ namespace controller { static Poco::AutoPtr create(int user_id, model::table::EmailOptInType type = model::table::EMAIL_OPT_IN_REGISTER); static Poco::AutoPtr 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 fields = { "user_id", "email_opt_in_type_id"}; + return getModel()->loadFromDB(fields, user_id, (int)type); + } inline Poco::AutoPtr getModel() { return _getModel(); } std::string getLink(); diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 917088ce4..21c9739a0 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -383,11 +383,17 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) } -bool Session::resetPassword(Poco::AutoPtr user, bool passphraseMemorized) +int Session::resetPassword(Poco::AutoPtr 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 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) diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index 044270222..1b08f8ff0 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -91,7 +91,9 @@ public: int updateEmailVerification(Poco::UInt64 emailVerificationCode); // called from page with same name - bool resetPassword(Poco::AutoPtr user, bool passphraseMemorized); + //! \return 1 = reset password email already send + //! \return 0 = ok + int resetPassword(Poco::AutoPtr user, bool passphraseMemorized); Poco::Net::HTTPCookie getLoginCookie(); diff --git a/src/cpp/model/table/EmailOptIn.cpp b/src/cpp/model/table/EmailOptIn.cpp index dc5146c1b..0dc26324c 100644 --- a/src/cpp/model/table/EmailOptIn.cpp +++ b/src/cpp/model/table/EmailOptIn.cpp @@ -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& 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(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(mType)) << std::endl; return ss.str(); } diff --git a/src/cpp/model/table/EmailOptIn.h b/src/cpp/model/table/EmailOptIn.h index 578915511..98512773c 100644 --- a/src/cpp/model/table/EmailOptIn.h +++ b/src/cpp/model/table/EmailOptIn.h @@ -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& 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; }; diff --git a/src/cpp/model/table/ModelBase.cpp b/src/cpp/model/table/ModelBase.cpp index 52c5f31cb..f1b967493 100644 --- a/src/cpp/model/table/ModelBase.cpp +++ b/src/cpp/model/table/ModelBase.cpp @@ -80,6 +80,13 @@ namespace model { } + Poco::Data::Statement ModelBase::_loadFromDB(Poco::Data::Session session, const std::vector& 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 = ""; diff --git a/src/cpp/model/table/ModelBase.h b/src/cpp/model/table/ModelBase.h index 2b9f3067e..b45194686 100644 --- a/src/cpp/model/table/ModelBase.h +++ b/src/cpp/model/table/ModelBase.h @@ -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 size_t updateIntoDB(const std::string& fieldName, const T& fieldValue ); template size_t loadFromDB(const std::string& fieldName, const T& fieldValue); + template size_t loadFromDB(const std::vector& 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& 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 + size_t ModelBase::loadFromDB(const std::vector& 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 size_t ModelBase::updateIntoDB(const std::string& fieldName, const T& fieldValue) { diff --git a/src/cpp/test/TestRegExp.cpp b/src/cpp/test/TestRegExp.cpp new file mode 100644 index 000000000..4647d7df5 --- /dev/null +++ b/src/cpp/test/TestRegExp.cpp @@ -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 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; +} \ No newline at end of file diff --git a/src/cpp/test/TestRegExp.h b/src/cpp/test/TestRegExp.h new file mode 100644 index 000000000..b8ef3246c --- /dev/null +++ b/src/cpp/test/TestRegExp.h @@ -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_ \ No newline at end of file diff --git a/src/cpp/test/main.cpp b/src/cpp/test/main.cpp index 3f9e94096..c49a883b6 100644 --- a/src/cpp/test/main.cpp +++ b/src/cpp/test/main.cpp @@ -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()); } diff --git a/src/cpp/test/main.h b/src/cpp/test/main.h index ac57bc341..943d24eb4 100644 --- a/src/cpp/test/main.h +++ b/src/cpp/test/main.h @@ -1,3 +1,4 @@ #include "TestTasks.h" #include "TestHash.h" +#include "TestRegExp.h" diff --git a/src/cpsp/flags.cpsp b/src/cpsp/flags.cpsp new file mode 100644 index 000000000..6cb31f338 --- /dev/null +++ b/src/cpsp/flags.cpsp @@ -0,0 +1,18 @@ +
+
+
+ +
+
+
+
+ +
+
+
\ No newline at end of file