From fb3d0b40ab04d4ed9f1fd7a94aa85369cb063a7f Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 5 Oct 2020 17:03:48 +0200 Subject: [PATCH] Iroha-ed25519, old user-implementation and key pair removed. libSodium seems to be compatible with Hedera now after all --- CMakeLists.txt | 4 +- README | 12 +- dependencies/iroha-ed25519 | 1 - skeema/gradido_login/users.sql | 1 + src/cpp/Crypto/KeyPair.cpp | 339 ----- src/cpp/Crypto/KeyPair.h | 69 - src/cpp/Crypto/KeyPairEd25519.h | 3 + src/cpp/Crypto/Passphrase.cpp | 5 + src/cpp/Crypto/Passphrase.h | 1 + src/cpp/Crypto/SecretKeyCryptography.cpp | 2 +- src/cpp/Crypto/SecretKeyCryptography.h | 1 + src/cpp/Gradido_LoginServer.cpp | 10 +- .../HTTPInterface/AdminCheckUserBackup.cpp | 42 +- .../HTTPInterface/AdminUserPasswordReset.cpp | 2 +- .../HTTPInterface/CheckTransactionPage.cpp | 56 +- src/cpp/HTTPInterface/DashboardPage.cpp | 28 +- src/cpp/HTTPInterface/DebugMnemonicPage.cpp | 4 +- src/cpp/HTTPInterface/DebugPassphrasePage.cpp | 101 +- src/cpp/HTTPInterface/ElopageWebhook.cpp | 2 +- src/cpp/HTTPInterface/Error500Page.cpp | 8 +- src/cpp/HTTPInterface/LoginPage.cpp | 31 +- .../PageRequestHandlerFactory.cpp | 15 +- src/cpp/HTTPInterface/PassphrasePage.cpp | 145 +- .../HTTPInterface/PassphrasedTransaction.cpp | 47 +- .../HTTPInterface/PassphrasedTransaction.cpsp | 25 +- src/cpp/HTTPInterface/RegisterAdminPage.cpp | 68 +- src/cpp/HTTPInterface/RegisterDirectPage.cpp | 48 +- src/cpp/HTTPInterface/RegisterPage.cpp | 211 --- src/cpp/HTTPInterface/RegisterPage.h | 18 - src/cpp/HTTPInterface/SaveKeysPage.cpp | 29 +- src/cpp/HTTPInterface/TranslatePassphrase.cpp | 40 +- src/cpp/HTTPInterface/UserUpdateGroupPage.cpp | 209 +++ src/cpp/HTTPInterface/UserUpdateGroupPage.h | 20 + src/cpp/ImportantTests.cpp | 33 +- src/cpp/JSONInterface/JsonCreateUser.cpp | 4 +- src/cpp/JSONInterface/JsonTransaction.cpp | 4 - src/cpp/controller/User.cpp | 40 +- src/cpp/controller/User.h | 20 +- src/cpp/controller/UserBackup.cpp | 31 +- src/cpp/controller/UserBackup.h | 5 +- src/cpp/model/Session.cpp | 337 +---- src/cpp/model/Session.h | 60 +- src/cpp/model/TransactionCreation.cpp | 15 +- src/cpp/model/TransactionCreation.h | 6 +- src/cpp/model/User.cpp | 1323 ----------------- src/cpp/model/User.h | 272 ---- src/cpp/model/table/User.cpp | 43 +- src/cpp/model/table/User.h | 51 +- src/cpp/tasks/SigningTransaction.h | 1 - src/cpsp/Error500.cpsp | 8 +- src/cpsp/PassphrasedTransaction.cpsp | 25 +- src/cpsp/adminCheckUserBackup.cpsp | 24 +- src/cpsp/adminUserPasswordReset.cpsp | 8 +- src/cpsp/checkTransaction.cpsp | 6 +- src/cpsp/dashboard.cpsp | 4 +- src/cpsp/debugMnemonic.cpsp | 4 +- src/cpsp/debugPassphrase.cpsp | 63 +- src/cpsp/login.cpsp | 7 +- src/cpsp/passphrase.cpsp | 23 +- src/cpsp/registerAdmin.cpsp | 39 +- src/cpsp/registerDirect.cpsp | 25 +- src/cpsp/saveKeys.cpsp | 5 +- src/cpsp/translatePassphrase.cpsp | 16 +- src/cpsp/updateUser.cpsp | 69 - src/cpsp/userUpdateGroup.cpsp | 62 + ...rPassword.cpsp => userUpdatePassword.cpsp} | 2 +- 66 files changed, 1083 insertions(+), 3149 deletions(-) delete mode 160000 dependencies/iroha-ed25519 delete mode 100644 src/cpp/Crypto/KeyPair.cpp delete mode 100644 src/cpp/Crypto/KeyPair.h delete mode 100644 src/cpp/HTTPInterface/RegisterPage.cpp delete mode 100644 src/cpp/HTTPInterface/RegisterPage.h create mode 100644 src/cpp/HTTPInterface/UserUpdateGroupPage.cpp create mode 100644 src/cpp/HTTPInterface/UserUpdateGroupPage.h delete mode 100644 src/cpp/model/User.cpp delete mode 100644 src/cpp/model/User.h delete mode 100644 src/cpsp/updateUser.cpsp create mode 100644 src/cpsp/userUpdateGroup.cpsp rename src/cpsp/{updateUserPassword.cpsp => userUpdatePassword.cpsp} (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index c8cbe2e74..efa20b628 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) include_directories( "dependencies" "dependencies/tinf/src/" - "dependencies/iroha-ed25519/include" "dependencies/mariadb-connector-c/include" "dependencies/mariadb-connector-c/build/include" "dependencies/spirit-po/include" @@ -96,7 +95,6 @@ if(WIN32) find_library(MYSQL_LIBRARIES mariadbclient.lib PATHS "dependencies/mariadb-connector-c/build/libmariadb/Release" REQUIRED) #find_library(MYSQL_LIBRARIES_DEBUG mariadbclient.lib PATHS "import/mariadb/lib/debug") find_library(COMPILED_MARIADB_CLIENT_DEBUG mariadbclient PATHS "dependencies/mariadb-connector-c/build/libmariadb/Debug" REQUIRED) -find_library(IROHA_ED25519 ed25519 PATHS "dependencies/iroha-ed25519/build/Debug" REQUIRED) set(GRPC_PATH "dependencies/grpc/_build/Debug") set(GRPC_ABSL_PATH "dependencies/grpc/_build/third_party/abseil-cpp/absl/types/Debug") set(GRPC_CARES_PATH "dependencies/grpc/_build/third_party/cares/cares/lib/Debug") @@ -183,7 +181,7 @@ endif(WIN32) add_subdirectory("dependencies/grpc/third_party/abseil-cpp") -target_link_libraries(Gradido_LoginServer absl::base absl::flat_hash_map absl::flags absl::memory absl::meta absl::numeric absl::strings ${CONAN_LIBS} ${IROHA_ED25519}) +target_link_libraries(Gradido_LoginServer absl::base absl::flat_hash_map absl::flags absl::memory absl::meta absl::numeric absl::strings ${CONAN_LIBS}) if(WIN32) TARGET_LINK_LIBRARIES(Gradido_LoginServer optimized ${MYSQL_LIBRARIES} Shlwapi) TARGET_LINK_LIBRARIES(Gradido_LoginServer debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) diff --git a/README b/README index de051e742..c6419d014 100644 --- a/README +++ b/README @@ -1,17 +1,6 @@ # get dependencies git submodule update --init --recursive -# build dependencies ed25519 -cd dependencies/iroha-ed25519 -mkdir build -cd build -# for windows with visual studio 14 2015 -# cmake .. -G"Visual Studio 14 2015 Win64" -DEDIMPL=ref10 -DHASH=sha2_sphlib -DRANDOM=bcryptgen -DBUILD=STATIC -# for linux -cmake .. -DEDIMPL=ref10 -DHASH=sha2_sphlib -DRANDOM=bcryptgen -DBUILD=STATIC -make - -cd ../../../ cd dependencies/mariadb-connector-c mkdir build @@ -33,6 +22,7 @@ cd ../../../ mkdir build && cd build # // not used anymore # conan remote add inexor https://api.bintray.com/conan/inexorgame/inexor-conan +# not needed, but bincrafter # conan install .. -s build_type=Debug conan install .. diff --git a/dependencies/iroha-ed25519 b/dependencies/iroha-ed25519 deleted file mode 160000 index 1fdf5b6e1..000000000 --- a/dependencies/iroha-ed25519 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1fdf5b6e10be2b1d7118aa3c32dc7acde02cb0cd diff --git a/skeema/gradido_login/users.sql b/skeema/gradido_login/users.sql index 783a36211..8fb359f12 100644 --- a/skeema/gradido_login/users.sql +++ b/skeema/gradido_login/users.sql @@ -12,6 +12,7 @@ CREATE TABLE `users` ( `passphrase_shown` tinyint NOT NULL DEFAULT '0', `language` varchar(4) NOT NULL DEFAULT 'de', `disabled` tinyint DEFAULT '0', + `group_id` int unsigned DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/src/cpp/Crypto/KeyPair.cpp b/src/cpp/Crypto/KeyPair.cpp deleted file mode 100644 index 770f3dedf..000000000 --- a/src/cpp/Crypto/KeyPair.cpp +++ /dev/null @@ -1,339 +0,0 @@ -#include "KeyPair.h" - -#include -#include - -#include "../SingletonManager/ErrorManager.h" -#include "../SingletonManager/ConnectionManager.h" - -#include "Poco/Types.h" - -#include "Passphrase.h" - -#include "../ServerConfig.h" - -using namespace Poco::Data::Keywords; - -#define STR_BUFFER_SIZE 25 - - - -KeyPair::KeyPair() - : mPrivateKey(nullptr), mSodiumSecret(nullptr) -{ - // TODO: set memory to zero for - // unsigned char mPublicKey[ed25519_pubkey_SIZE]; - // unsigned char mSodiumPublic[crypto_sign_PUBLICKEYBYTES]; - memset(mPublicKey, 0, ed25519_pubkey_SIZE); - memset(mSodiumPublic, 0, crypto_sign_PUBLICKEYBYTES); -} - -KeyPair::~KeyPair() -{ - auto mm = MemoryManager::getInstance(); - //printf("[KeyPair::~KeyPair] privkey: %d, soduium privkey: %d \n", mPrivateKey, mSodiumSecret); - if (mPrivateKey) { - //delete mPrivateKey; - mm->releaseMemory(mPrivateKey); - mPrivateKey = nullptr; - } - if (mSodiumSecret) { - //delete mSodiumSecret; - mm->releaseMemory(mSodiumSecret); - mSodiumSecret = nullptr; - } -} - -std::string KeyPair::passphraseTransform(const std::string& passphrase, const Mnemonic* currentWordSource, const Mnemonic* targetWordSource) -{ - if (!currentWordSource || !targetWordSource) { - return ""; - } - if (targetWordSource == currentWordSource) { - return passphrase; - } - auto word_indices = createWordIndices(passphrase, currentWordSource); - if (!word_indices) { - return ""; - } - - return createClearPassphraseFromWordIndices(word_indices, targetWordSource); -} - -bool KeyPair::generateFromPassphrase(const char* passphrase, const Mnemonic* word_source) -{ - auto er = ErrorManager::getInstance(); - auto mm = MemoryManager::getInstance(); - // libsodium doc: https://libsodium.gitbook.io/doc/advanced/hmac-sha2 - // https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki - //crypto_auth_hmacsha512_keygen - auto word_indices = createWordIndices(passphrase, word_source); - if (!word_indices) { - return false; - } - - std::string clearPassphrase = - createClearPassphraseFromWordIndices(word_indices, &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]); - -// printf("clear passphrase: %s\n", clearPassphrase.data()); - sha_context state; - - unsigned char hash[SHA_512_SIZE]; - //crypto_auth_hmacsha512_state state; - size_t word_index_size = sizeof(word_indices); - //crypto_auth_hmacsha512_init(&state, (unsigned char*)word_indices, sizeof(word_indices)); - - sha512_init(&state); - sha512_update(&state, *word_indices, word_indices->size()); - sha512_update(&state, (unsigned char*)clearPassphrase.data(), clearPassphrase.size()); - //crypto_auth_hmacsha512_update(&state, (unsigned char*)passphrase, pass_phrase_size); - sha512_final(&state, hash); - //crypto_auth_hmacsha512_final(&state, hash); - - /* - // debug passphrase - printf("\passsphrase: <%s>\n", passphrase); - printf("size word indices: %u\n", word_indices->size()); - std::string word_indicesHex = getHex(*word_indices, word_indices->size()); - printf("word_indices: \n%s\n", word_indicesHex.data()); - printf("word_indices: \n"); - Poco::UInt64* word_indices_p = (Poco::UInt64*)(word_indices->data()); - for (int i = 0; i < PHRASE_WORD_COUNT; i++) { - if (i > 0) printf(" "); - printf("%4hu", word_indices_p[i]); - } - printf("\n"); - - printf("\nclear passphrase: \n%s\n", clearPassphrase.data()); - std::string hex_clearPassphrase = getHex((const unsigned char*)clearPassphrase.data(), clearPassphrase.size()); - printf("passphrase bin: \n%s\n\n", hex_clearPassphrase.data()); - - //*/ - - mm->releaseMemory(word_indices); - - - //ed25519_create_keypair(public_key, private_key, hash); - private_key_t prv_key_t; - memcpy(prv_key_t.data, hash, 32); - public_key_t pbl_key_t; - ed25519_derive_public_key(&prv_key_t, &pbl_key_t); - - //memcpy(private_key, prv_key_t.data, 32); - if (!mPrivateKey) { - //delete mPrivateKey; - mPrivateKey = mm->getFreeMemory(ed25519_privkey_SIZE); - if (!mPrivateKey) { - return false; - } - } - //mPrivateKey = new ObfusArray(ed25519_privkey_SIZE, prv_key_t.data); - - memcpy(*mPrivateKey, prv_key_t.data, ed25519_privkey_SIZE); - - memcpy(mPublicKey, pbl_key_t.data, ed25519_pubkey_SIZE); - - if (!mSodiumSecret) { - //delete mSodiumSecret; - //mm->releaseMemory(mSodiumSecret); - mSodiumSecret = mm->getFreeMemory(crypto_sign_SECRETKEYBYTES); - } - //unsigned char sodium_secret[crypto_sign_SECRETKEYBYTES]; - - - crypto_sign_seed_keypair(mSodiumPublic, *mSodiumSecret, *mPrivateKey); - - - // print hex for all keys for debugging -/* printf("// ********** Keys ************* //\n"); - printf("Public: \t%s\n", getHex(mPublicKey, ed25519_pubkey_SIZE).data()); - printf("Private: \t%s\n", getHex(*mPrivateKey, mPrivateKey->size()).data()); - printf("Sodium Public: \t%s\n", getHex(mSodiumPublic, crypto_sign_PUBLICKEYBYTES).data()); - printf("Sodium Private: \t%s\n", getHex(*mSodiumSecret, mSodiumSecret->size()).data()); - printf("// ********* Keys End ************ //\n"); -*/ - //printf("[KeyPair::generateFromPassphrase] finished!\n"); - // using - return true; -} - -bool KeyPair::generateFromPassphrase(const std::string& passphrase) -{ - //static bool validatePassphrase(const std::string& passphrase, Mnemonic** wordSource = nullptr); - Mnemonic* wordSource = nullptr; - if (validatePassphrase(passphrase, &wordSource)) { - return generateFromPassphrase(passphrase.data(), wordSource); - } - return false; -} - -MemoryBin* KeyPair::createWordIndices(const std::string& passphrase, const Mnemonic* word_source) -{ - auto er = ErrorManager::getInstance(); - auto mm = MemoryManager::getInstance(); - - auto word_indices = mm->getFreeMemory(sizeof(Poco::UInt64) * PHRASE_WORD_COUNT); - Poco::UInt64* word_indices_p = (Poco::UInt64*)(word_indices->data()); - //Poco::UInt64 word_indices_old[PHRASE_WORD_COUNT] = { 0 }; - //memset(word_indices_old, 0, PHRASE_WORD_COUNT * sizeof(Poco::UInt64));// *sizeof(unsigned long)); - memset(*word_indices, 0, word_indices->size()); - - //DHASH key = DRMakeStringHash(passphrase); - size_t pass_phrase_size = passphrase.size(); - - char acBuffer[STR_BUFFER_SIZE]; memset(acBuffer, 0, STR_BUFFER_SIZE); - size_t buffer_cursor = 0; - - // get word indices for hmac key - unsigned char word_cursor = 0; - for (auto it = passphrase.begin(); it != passphrase.end(); it++) - { - if (*it == ' ') { - if (buffer_cursor < 3) { - continue; - } - if (PHRASE_WORD_COUNT > word_cursor && word_source->isWordExist(acBuffer)) { - word_indices_p[word_cursor] = word_source->getWordIndex(acBuffer); - //word_indices_old[word_cursor] = word_source->getWordIndex(acBuffer); - } - else { - er->addError(new ParamError("KeyPair::generateFromPassphrase", "word didn't exist", acBuffer)); - er->sendErrorsAsEmail(); - mm->releaseMemory(word_indices); - return nullptr; - } - word_cursor++; - memset(acBuffer, 0, STR_BUFFER_SIZE); - buffer_cursor = 0; - - } - else { - acBuffer[buffer_cursor++] = *it; - } - } - if (PHRASE_WORD_COUNT > word_cursor && word_source->isWordExist(acBuffer)) { - word_indices_p[word_cursor] = word_source->getWordIndex(acBuffer); - //word_indices_old[word_cursor] = word_source->getWordIndex(acBuffer); - word_cursor++; - } - //printf("word cursor: %d\n", word_cursor); - /*if (memcmp(word_indices_p, word_indices_old, word_indices->size()) != 0) { - - printf("not identical\n"); - memcpy(word_indices_p, word_indices_old, word_indices->size()); - }*/ - return word_indices; -} - -std::string KeyPair::createClearPassphraseFromWordIndices(MemoryBin* word_indices, const Mnemonic* word_source) -{ - Poco::UInt64* word_indices_p = (Poco::UInt64*)word_indices->data(); - std::string clearPassphrase; - for (int i = 0; i < PHRASE_WORD_COUNT; i++) { - if (i * sizeof(Poco::UInt64) >= word_indices->size()) break; - auto word = word_source->getWord(word_indices_p[i]); - if (word) { - clearPassphrase += word; - clearPassphrase += " "; - } - } - return clearPassphrase; -} - -std::string KeyPair::filterPassphrase(const std::string& passphrase) -{ - return Passphrase::filter(passphrase); -} - -std::string KeyPair::getPubkeyHex() -{ - const size_t hexSize = crypto_sign_PUBLICKEYBYTES * 2 + 1; - - char hexString[hexSize]; - memset(hexString, 0, hexSize); - sodium_bin2hex(hexString, hexSize, mSodiumPublic, crypto_sign_PUBLICKEYBYTES); - - return std::string(hexString); -} - -std::string KeyPair::getHex(const unsigned char* data, Poco::UInt32 size) -{ - auto mm = MemoryManager::getInstance(); - - Poco::UInt32 hexSize = size * 2 + 1; - auto hexMem = mm->getFreeMemory(hexSize); - //char* hexString = (char*)malloc(hexSize); - memset(*hexMem, 0, hexSize); - sodium_bin2hex(*hexMem, hexSize, data, size); - std::string hex = (char*)*hexMem; -// free(hexString); - mm->releaseMemory(hexMem); - - return hex; -} - -std::string KeyPair::getHex(const MemoryBin* data) -{ - return getHex(*data, data->size()); -} - -bool KeyPair::savePrivKey(int userId) -{ - auto cm = ConnectionManager::getInstance(); - auto em = ErrorManager::getInstance(); - auto mysql_session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - Poco::Data::Statement update(mysql_session); - Poco::Data::BLOB privkey_blob((const unsigned char*)(*mPrivateKey), mPrivateKey->size()); - - update << "UPDATE users set privkey = ? where id = ?", - use(privkey_blob), use(userId); - - try { - if (update.execute() != 1) { - em->addError(new ParamError("KeyPair::savePrivKey", "error writing privkey, user not found? ", std::to_string(userId))); - em->sendErrorsAsEmail(); - return false; - } - } catch (Poco::Exception& ex) { - em->addError(new ParamError("KeyPair::savePrivKey", "exception by running mysql", ex.displayText())); - em->sendErrorsAsEmail(); - return false; - } - return true; -} - -bool KeyPair::isPubkeysTheSame(const unsigned char* pubkey) const -{ - return sodium_memcmp(pubkey, mPublicKey, ed25519_pubkey_SIZE) == 0; -} - -bool KeyPair::validatePassphrase(const std::string& passphrase, Mnemonic** wordSource/* = nullptr*/) -{ - std::istringstream iss(passphrase); - std::vector results(std::istream_iterator{iss}, - std::istream_iterator()); - - for (int i = 0; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) { - Mnemonic& m = ServerConfig::g_Mnemonic_WordLists[i]; - bool existAll = true; - for (auto it = results.begin(); it != results.end(); it++) { - if (*it == "\0" || *it == "" || it->size() < 3) continue; - if (!m.isWordExist(*it)) { - if (i == 1) { - int zahl = 0; - } - //printf("wordlist: %d, word not found: %s\n", i, it->data()); - existAll = false; - continue; - } - } - if (existAll) { - if (wordSource) { - *wordSource = &m; - } - - return true; - } - } - return false; -} diff --git a/src/cpp/Crypto/KeyPair.h b/src/cpp/Crypto/KeyPair.h deleted file mode 100644 index 67a84f6da..000000000 --- a/src/cpp/Crypto/KeyPair.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef GRADIDO_LOGIN_SERVER_CRYPTO_KEY_PAIR -#define GRADIDO_LOGIN_SERVER_CRYPTO_KEY_PAIR - -#include "Obfus_array.h" -#include "../SingletonManager/MemoryManager.h" -#include "mnemonic.h" - -#include "ed25519/ed25519.h" -#include - -class UserWriteKeysIntoDB; -class UserGenerateKeys; -class DebugPassphrasePage; -class User; -class RepairDefectPassphrase; - -// TODO: https://libsodium.gitbook.io/doc/advanced/ed25519-curve25519 -class KeyPair -{ - friend UserWriteKeysIntoDB; - friend UserGenerateKeys; - friend DebugPassphrasePage; - friend User; - friend RepairDefectPassphrase; -public: - KeyPair(); - ~KeyPair(); - - bool generateFromPassphrase(const char* passphrase, const Mnemonic* word_source); - bool generateFromPassphrase(const std::string& passphrase); - static std::string passphraseTransform(const std::string& passphrase, const Mnemonic* currentWordSource, const Mnemonic* targetWordSource); - static std::string filterPassphrase(const std::string& passphrase); - static bool validatePassphrase(const std::string& passphrase, Mnemonic** wordSource = nullptr); - - std::string getPubkeyHex(); - bool savePrivKey(int userId); - static std::string getHex(const unsigned char* data, Poco::UInt32 size); - static std::string getHex(const MemoryBin* data); - - inline const unsigned char* getPublicKey() const { return mSodiumPublic; } - - bool isPubkeysTheSame(const unsigned char* pubkey) const; - -protected: - const MemoryBin* getPrivateKey() const { return mSodiumSecret; } - - static MemoryBin* createWordIndices(const std::string& passphrase, const Mnemonic* word_source); - static std::string createClearPassphraseFromWordIndices(MemoryBin* word_indices, const Mnemonic* word_source); - - -private: - // 32 Byte - //! \brief ed25519 ref10 private key - MemoryBin* mPrivateKey; - - // 64 Byte - //! \brief ed25519 libsodium private key - MemoryBin* mSodiumSecret; - - // 32 Byte - //! \brief ed25519 ref10 public key - unsigned char mPublicKey[ed25519_pubkey_SIZE]; - - // 32 Byte - //! \brief ed25519 libsodium public key - unsigned char mSodiumPublic[crypto_sign_PUBLICKEYBYTES]; -}; - -#endif //GRADIDO_LOGIN_SERVER_CRYPTO_KEY_PAIR \ No newline at end of file diff --git a/src/cpp/Crypto/KeyPairEd25519.h b/src/cpp/Crypto/KeyPairEd25519.h index 08da7030d..efe26b914 100644 --- a/src/cpp/Crypto/KeyPairEd25519.h +++ b/src/cpp/Crypto/KeyPairEd25519.h @@ -16,6 +16,7 @@ #include "sodium.h" #include "SecretKeyCryptography.h" #include "Passphrase.h" +#include "../lib/DataTypeConverter.h" class KeyPairEd25519 : public IKeyPair { @@ -37,6 +38,8 @@ public: MemoryBin* sign(const unsigned char* message, size_t messageSize) const; inline const unsigned char* getPublicKey() const { return mSodiumPublic; } + inline std::string getPublicKeyHex() const { return DataTypeConverter::binToHex(mSodiumPublic, getPublicKeySize()); } + const static size_t getPublicKeySize() { return crypto_sign_PUBLICKEYBYTES; } inline bool isTheSame(const KeyPairEd25519& b) const { return 0 == sodium_memcmp(mSodiumPublic, b.mSodiumPublic, crypto_sign_PUBLICKEYBYTES); diff --git a/src/cpp/Crypto/Passphrase.cpp b/src/cpp/Crypto/Passphrase.cpp index 61599a69d..cad034673 100644 --- a/src/cpp/Crypto/Passphrase.cpp +++ b/src/cpp/Crypto/Passphrase.cpp @@ -133,6 +133,11 @@ Poco::AutoPtr Passphrase::transform(const Mnemonic* targetWordSource return nullptr; } +Poco::AutoPtr Passphrase::create(const std::string& passphrase, const Mnemonic* wordSource) +{ + return new Passphrase(passphrase, wordSource); +} + Poco::AutoPtr Passphrase::create(const MemoryBin* wordIndices, const Mnemonic* wordSource) { if (PHRASE_WORD_COUNT * sizeof(Poco::UInt16) >= wordIndices->size()) { diff --git a/src/cpp/Crypto/Passphrase.h b/src/cpp/Crypto/Passphrase.h index cfd680afd..d83b597e4 100644 --- a/src/cpp/Crypto/Passphrase.h +++ b/src/cpp/Crypto/Passphrase.h @@ -16,6 +16,7 @@ public: static Poco::AutoPtr create(const Poco::UInt16 wordIndices[PHRASE_WORD_COUNT], const Mnemonic* wordSource); static Poco::AutoPtr create(const MemoryBin* wordIndices, const Mnemonic* wordSource); + static Poco::AutoPtr create(const std::string& passphrase, const Mnemonic* wordSource); //! \brief generate new passphrase with random static Poco::AutoPtr generate(const Mnemonic* wordSource); static const Mnemonic* detectMnemonic(const std::string& passphrase, const KeyPairEd25519* keyPair = nullptr); diff --git a/src/cpp/Crypto/SecretKeyCryptography.cpp b/src/cpp/Crypto/SecretKeyCryptography.cpp index 0685ecaff..8710a5b8c 100644 --- a/src/cpp/Crypto/SecretKeyCryptography.cpp +++ b/src/cpp/Crypto/SecretKeyCryptography.cpp @@ -76,7 +76,7 @@ SecretKeyCryptography::ResultType SecretKeyCryptography::createKey(const std::st assert(ServerConfig::g_ServerCryptoKey); crypto_shorthash((unsigned char*)&mEncryptionKeyHash, *mEncryptionKey, crypto_box_SEEDBYTES, *ServerConfig::g_ServerCryptoKey); - return AUTH_ENCRYPT_OK; + return AUTH_CREATE_ENCRYPTION_KEY_SUCCEED; } SecretKeyCryptography::ResultType SecretKeyCryptography::encrypt(const MemoryBin* message, MemoryBin** encryptedMessage) const diff --git a/src/cpp/Crypto/SecretKeyCryptography.h b/src/cpp/Crypto/SecretKeyCryptography.h index 0a0a16072..87d69e4ed 100644 --- a/src/cpp/Crypto/SecretKeyCryptography.h +++ b/src/cpp/Crypto/SecretKeyCryptography.h @@ -30,6 +30,7 @@ public: enum ResultType { AUTH_ENCRYPT_OK, AUTH_DECRYPT_OK, + AUTH_CREATE_ENCRYPTION_KEY_SUCCEED, AUTH_CREATE_ENCRYPTION_KEY_FAILED, AUTH_NO_KEY, AUTH_ENCRYPT_MESSAGE_FAILED, diff --git a/src/cpp/Gradido_LoginServer.cpp b/src/cpp/Gradido_LoginServer.cpp index 1459a89b9..cf17a0fba 100644 --- a/src/cpp/Gradido_LoginServer.cpp +++ b/src/cpp/Gradido_LoginServer.cpp @@ -11,6 +11,8 @@ #include "controller/User.h" +#include "Crypto/SecretKeyCryptography.h" + #include "Poco/Util/HelpFormatter.h" #include "Poco/Net/ServerSocket.h" #include "Poco/Net/HTTPServer.h" @@ -155,11 +157,13 @@ int Gradido_LoginServer::main(const std::vector& args) } // first check time for crypto - auto testUser = new User("email@google.de", "Max", "Mustermann"); + SecretKeyCryptography test_crypto; Profiler timeUsed; - testUser->validatePwd("haz27Newpassword", nullptr); + if (test_crypto.createKey("email@google.de", "haz27Newpassword") != SecretKeyCryptography::AUTH_CREATE_ENCRYPTION_KEY_SUCCEED) { + errorLog.error("[Gradido_LoginServer::main] error create secure pwd hash"); + return Application::EXIT_SOFTWARE; + } ServerConfig::g_FakeLoginSleepTime = (int)std::round(timeUsed.millis()); - delete testUser; Poco::Int64 i1 = randombytes_random(); Poco::Int64 i2 = randombytes_random(); diff --git a/src/cpp/HTTPInterface/AdminCheckUserBackup.cpp b/src/cpp/HTTPInterface/AdminCheckUserBackup.cpp index c2ebcd232..3139ff59a 100644 --- a/src/cpp/HTTPInterface/AdminCheckUserBackup.cpp +++ b/src/cpp/HTTPInterface/AdminCheckUserBackup.cpp @@ -7,7 +7,8 @@ #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" +#include "../Crypto/Passphrase.h" #include "../SingletonManager/ConnectionManager.h" #include "../controller/UserBackup.h" @@ -42,11 +43,11 @@ void AdminCheckUserBackup::handleRequest(Poco::Net::HTTPServerRequest& request, if (_compressResponse) response.set("Content-Encoding", "gzip"); Poco::Net::HTMLForm form(request, request.stream()); -#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 26 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" const char* pageName = "Admin Check User Backups"; auto cm = ConnectionManager::getInstance(); - KeyPair keys; + std::list notMatchingEntrys; auto con = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); @@ -65,21 +66,24 @@ void AdminCheckUserBackup::handleRequest(Poco::Net::HTTPServerRequest& request, if(pubkey.isNull()) { continue; } - auto passphrase = KeyPair::filterPassphrase(tuple.get<2>()); + auto passphrase = Passphrase::filter(tuple.get<2>()); auto user_id = tuple.get<0>(); - Mnemonic* wordSource = nullptr; - if(!User::validatePassphrase(passphrase, &wordSource)) { + KeyPairEd25519 key_pair(pubkey.value().content().data()); + + auto wordSource = Passphrase::detectMnemonic(passphrase); + if(!wordSource) { addError(new Error("admin Check user backup", "invalid passphrase"), false); addError(new ParamError("admin Check user backup", "passphrase", passphrase.data()), false); addError(new ParamError("admin Check user backup", "user id", user_id), false); continue; - } else { - keys.generateFromPassphrase(passphrase.data(), wordSource); - } + } + auto passphrase_object = Passphrase::create(passphrase, wordSource); + auto key_pair_from_passhrase = KeyPairEd25519::create(passphrase_object); bool matching = false; - if(keys.isPubkeysTheSame(pubkey.value().content().data())) { + if(key_pair_from_passhrase->isTheSame(key_pair)) { matching = true; } + delete key_pair_from_passhrase; if(user_id != last_user_id) { last_user_id = user_id; if(matching) continue; @@ -177,11 +181,11 @@ void AdminCheckUserBackup::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "
\n"; responseStream << "\t

Admin Check User Backup

\n"; responseStream << "\t"; -#line 91 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "\t

Unmatching count: "; -#line 92 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( notMatchingEntrys.size() ); responseStream << "

\n"; responseStream << "\t\n"; @@ -190,34 +194,34 @@ void AdminCheckUserBackup::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\n"; responseStream << "\t\t\n"; responseStream << "\t\t\t"; -#line 98 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 102 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" for(auto it = notMatchingEntrys.begin(); it != notMatchingEntrys.end(); it++) { auto userModel = (*it).user->getModel(); responseStream << "\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\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t"; -#line 108 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 112 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" } responseStream << "\n"; responseStream << "\t\t\n"; responseStream << "\n"; diff --git a/src/cpp/HTTPInterface/AdminUserPasswordReset.cpp b/src/cpp/HTTPInterface/AdminUserPasswordReset.cpp index 71a2f1bb0..d26eec225 100644 --- a/src/cpp/HTTPInterface/AdminUserPasswordReset.cpp +++ b/src/cpp/HTTPInterface/AdminUserPasswordReset.cpp @@ -73,7 +73,7 @@ void AdminUserPasswordReset::handleRequest(Poco::Net::HTTPServerRequest& request auto userPubkey = user->getModel()->getPublicKey(); for(auto it = backups.begin(); it != backups.end(); it++) { auto keys = (*it)->getKeyPair(); - if(keys->isPubkeysTheSame(userPubkey)) { + if(keys->isTheSame(userPubkey)) { userBackup = *it; break; } diff --git a/src/cpp/HTTPInterface/CheckTransactionPage.cpp b/src/cpp/HTTPInterface/CheckTransactionPage.cpp index 0dc3231cc..8ddbadbe0 100644 --- a/src/cpp/HTTPInterface/CheckTransactionPage.cpp +++ b/src/cpp/HTTPInterface/CheckTransactionPage.cpp @@ -389,52 +389,54 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\t"; #line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" - if(transactionUser) { responseStream << "\n"; + if(!transactionUser.isNull()) { + auto user_model = transactionUser->getModel(); + responseStream << "\n"; responseStream << "\t\t\t\t\t\t"; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" - responseStream << ( transactionUser->getFirstName() ); +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + responseStream << ( user_model->getFirstName() ); responseStream << " "; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" - responseStream << ( transactionUser->getLastName() ); +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + responseStream << ( user_model->getLastName() ); responseStream << " <"; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" - responseStream << ( transactionUser->getEmail() ); +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" + responseStream << ( user_model->getEmail() ); responseStream << ">\n"; responseStream << "\t\t\t\t\t"; -#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 170 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else { responseStream << "\n"; responseStream << "\t\t\t\t\t\t0x"; -#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getPublicHex() ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 170 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 172 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getTargetDateString() ); responseStream << "\n"; responseStream << "\t\t\t\t\t"; -#line 172 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 174 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( creationTransaction->getAmountString() ); responseStream << " GDD\n"; responseStream << "\t\t\t\t
\n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t "; -#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 177 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } else if(PAGE_USER_DATA_CORRUPTED == state) { responseStream << "\n"; responseStream << "\t\t\t\t

"; -#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( gettext("Es gibt ein Problem mit deinen gespeicherten Daten, bitte wende dich an den")); responseStream << "getAdminReceiver()); responseStream << "?subject=Corrupt User Data&body=Hallo Dario,%0D%0A%0D%0Ameine Benutzer Daten sind korrupt.%0D%0Akannst du das prüfen?%0D%0A%0D%0AMit freundlichen Grüßen%0D%0A\">"; -#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << (gettext("Support") ); responseStream << "

\n"; responseStream << "\t\t\t "; -#line 177 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 179 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t
\n"; @@ -442,7 +444,7 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t"; -#line 183 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 185 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( user_model->getNameWithEmailHtml() ); responseStream << "\n"; responseStream << "\t\t\t
\n"; @@ -453,45 +455,45 @@ void CheckTransactionPage::handleRequest(Poco::Net::HTTPServerRequest& request, responseStream << "\t\t\t
\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\t"; -#line 191 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 193 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" responseStream << ( memo ); responseStream << "\n"; responseStream << "\t\t\t
\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t\t\t"; -#line 195 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 197 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(!account_user->hasPassword()) { responseStream << "\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
\n"; responseStream << "\t\t\t\t"; -#line 200 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 202 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t"; -#line 201 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 203 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" if(PAGE_USER_DATA_CORRUPTED != state && user_model->isEmailChecked()) { responseStream << "\n"; responseStream << "\t\t\t\t\t\n"; responseStream << "\t\t\t\t"; -#line 206 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" +#line 208 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\checkTransaction.cpsp" } responseStream << "\n"; responseStream << "\t\t\t\t\n"; diff --git a/src/cpp/HTTPInterface/DashboardPage.cpp b/src/cpp/HTTPInterface/DashboardPage.cpp index dcd034d63..228fb160f 100644 --- a/src/cpp/HTTPInterface/DashboardPage.cpp +++ b/src/cpp/HTTPInterface/DashboardPage.cpp @@ -31,6 +31,8 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N #line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" const char* pageName = "Dashboard"; + auto user = mSession->getNewUser(); + auto user_model = user->getModel(); //Poco::Net::NameValueCollection cookies; //request.getCookies(cookies); if(!form.empty()) { @@ -109,34 +111,34 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\n"; responseStream << "
\n"; responseStream << "\t

Willkommen "; -#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" - responseStream << ( mSession->getUser()->getFirstName() ); +#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" + responseStream << ( user_model->getFirstName() ); responseStream << " "; -#line 23 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" - responseStream << ( mSession->getUser()->getLastName() ); +#line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" + responseStream << ( user_model->getLastName() ); responseStream << "

\n"; responseStream << "\t"; -#line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" +#line 26 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" responseStream << ( mSession->getErrorsHtml() ); responseStream << "\n"; responseStream << "\t

Status

\n"; responseStream << "\t

"; -#line 26 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" +#line 28 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" responseStream << ( mSession->getSessionStateString() ); responseStream << "

\n"; responseStream << "\t"; -#line 27 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" +#line 29 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" if(mSession->getSessionState() == SESSION_STATE_EMAIL_VERIFICATION_SEND) { responseStream << "\n"; responseStream << "\t

Verification Code E-Mail wurde erfolgreich an dich verschickt, bitte schaue auch in dein Spam-Verzeichnis nach wenn du sie nicht findest und klicke auf den Link den du dort findest oder kopiere den Code hier her:

\n"; responseStream << "\t\n"; responseStream << "\t\t\n"; responseStream << "\t\t\n"; responseStream << "\t\n"; responseStream << "\t"; -#line 33 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" +#line 35 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" } else if(mSession->getSessionState() == SESSION_STATE_EMAIL_VERIFICATION_WRITTEN) { responseStream << "\n"; responseStream << "\t

Hast du schon eine E-Mail mit einem Verification Code erhalten? Wenn ja kannst du ihn hier hinein kopieren:

\n"; responseStream << "\t
\n"; @@ -144,14 +146,14 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\t\t\n"; responseStream << "\t\n"; responseStream << "\t"; -#line 39 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" +#line 41 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\dashboard.cpsp" } responseStream << "\n"; responseStream << "\tAbmelden\n"; responseStream << "\tAccount löschen\n"; responseStream << "
\n"; @@ -159,7 +161,7 @@ void DashboardPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::N responseStream << "\t
\n"; responseStream << "\t\t
    \n"; responseStream << "\t\t
  • Startseite\n"; responseStream << "\t\t
  • Logout
  • \n"; diff --git a/src/cpp/HTTPInterface/DebugMnemonicPage.cpp b/src/cpp/HTTPInterface/DebugMnemonicPage.cpp index 8065c725f..8c9c492d6 100644 --- a/src/cpp/HTTPInterface/DebugMnemonicPage.cpp +++ b/src/cpp/HTTPInterface/DebugMnemonicPage.cpp @@ -8,7 +8,7 @@ #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugMnemonic.cpsp" #include "../ServerConfig.h" -#include "../Crypto/KeyPair.h" +#include "../Crypto/Passphrase.h" struct WordChecked { WordChecked() : index(0), bSet(false) {}; @@ -69,7 +69,7 @@ void DebugMnemonicPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poc { if("" != form.get("check_word", "")) { - auto word = KeyPair::filterPassphrase(form.get("word", "")); + auto word = Passphrase::filter(form.get("word", "")); if("" != word) { checkedWord.bSet = true; checkedWord.word = word; diff --git a/src/cpp/HTTPInterface/DebugPassphrasePage.cpp b/src/cpp/HTTPInterface/DebugPassphrasePage.cpp index e5990c1d2..cbfb5bad6 100644 --- a/src/cpp/HTTPInterface/DebugPassphrasePage.cpp +++ b/src/cpp/HTTPInterface/DebugPassphrasePage.cpp @@ -7,7 +7,8 @@ #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" +#include "../controller/User.h" #line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" #include "../ServerConfig.h" @@ -27,44 +28,34 @@ void DebugPassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, P if (_compressResponse) response.set("Content-Encoding", "gzip"); Poco::Net::HTMLForm form(request, request.stream()); -#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" +#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" const char* pageName = "Debug Passphrase"; - auto mm = MemoryManager::getInstance(); - KeyPair keys; - std::string privKeyHex = ""; + + KeyPairEd25519* keys = nullptr; std::string privKeyCryptedHex = ""; - User::passwordHashed pwdHashed = 0; + Poco::UInt64 pwdHashed = 0; Poco::AutoPtr existingUser; if(!form.empty()) { - auto passphrase = KeyPair::filterPassphrase(form.get("passphrase", "")); - Mnemonic* wordSource = nullptr; - if(!User::validatePassphrase(passphrase, &wordSource)) { + auto passphrase_string = form.get("passphrase", ""); + auto wordSource = Passphrase::detectMnemonic(passphrase_string); + if(!wordSource) { addError(new Error("debug Passphrase", "invalid passphrase"), false); } else { - keys.generateFromPassphrase(passphrase.data(), wordSource); + keys = KeyPairEd25519::create(Passphrase::create(passphrase_string, wordSource)); } auto email = form.get("email", ""); - auto newUser = new User(email.data(), "first_name", "last_name"); - if(email != "") { existingUser = controller::User::create(); - existingUser->load(email); - } - newUser->validatePwd(form.get("password", ""), this); - pwdHashed = newUser->getPwdHashed(); - auto privKey = keys.getPrivateKey(); - if(privKey) { - privKeyHex = KeyPair::getHex(privKey); - auto privKeyCrypted = newUser->encrypt(privKey); - if(privKeyCrypted) { - privKeyCryptedHex = KeyPair::getHex(privKeyCrypted); - mm->releaseMemory(privKeyCrypted); + if(1 == existingUser->load(email)) { + auto user_model = existingUser->getModel(); + pwdHashed = user_model->getPasswordHashed(); + if(user_model->hasPrivateKeyEncrypted()) { + privKeyCryptedHex = user_model->getPrivateKeyEncryptedHex(); + } } } - getErrors(newUser); - delete newUser; } @@ -139,7 +130,7 @@ void DebugPassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, P responseStream << "
    \n"; responseStream << "\t

    Debug Passphrase

    \n"; responseStream << "\t"; -#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" +#line 44 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "\t
    \n"; @@ -148,51 +139,51 @@ void DebugPassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, P responseStream << "\t\t\t

    \n"; responseStream << "\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\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

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

    Public key:
    "; -#line 69 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" - responseStream << ( keys.getPubkeyHex() ); + responseStream << "\t"; +#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + if(keys) { responseStream << "\n"; + responseStream << "\t\t

    Public key:
    "; +#line 57 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( keys->getPublicKeyHex() ); responseStream << "

    \n"; - responseStream << "\t

    Private Key:
    "; -#line 70 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" - responseStream << ( privKeyHex ); - responseStream << "

    \n"; - responseStream << "\t

    Passwort Hashed:
    "; -#line 71 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" - responseStream << ( std::to_string(pwdHashed) ); - responseStream << "

    \n"; - responseStream << "\t

    Private key crypted:
    "; -#line 72 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << "\t\t

    Private key crypted:
    "; +#line 58 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" responseStream << ( privKeyCryptedHex ); responseStream << "

    \n"; - responseStream << "\t"; -#line 73 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" - if(!existingUser.isNull()) { - auto userModel = existingUser->getModel(); - auto dbPubkey = userModel->getPublicKey(); - responseStream << "\n"; - responseStream << "\t\t

    user Public:
    "; -#line 77 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" - responseStream << ( KeyPair::getHex(dbPubkey, ed25519_pubkey_SIZE) ); + responseStream << "\t\t

    Passwort Hashed:
    "; +#line 59 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( std::to_string(pwdHashed) ); responseStream << "

    \n"; + responseStream << "\t\t"; +#line 60 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + if(!existingUser.isNull()) { + auto userModel = existingUser->getModel(); + auto dbPubkey = userModel->getPublicKey(); + responseStream << "\n"; + responseStream << "\t\t\t

    user Public:
    "; +#line 64 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + responseStream << ( keys->getPublicKeyHex() ); + responseStream << "

    \n"; + responseStream << "\t\t"; +#line 65 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + } responseStream << "\n"; responseStream << "\t"; -#line 78 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" +#line 66 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" } responseStream << "\n"; responseStream << "
    \n"; +#line 68 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\debugPassphrase.cpsp" + if(keys) delete keys; responseStream << "\n"; // begin include footer.cpsp responseStream << "
    \n"; responseStream << "

    Copyright © Gradido 2020

    \n"; diff --git a/src/cpp/HTTPInterface/ElopageWebhook.cpp b/src/cpp/HTTPInterface/ElopageWebhook.cpp index d89429918..5be4ac8f0 100644 --- a/src/cpp/HTTPInterface/ElopageWebhook.cpp +++ b/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -320,7 +320,7 @@ int HandleElopageRequestTask::run() mEmail = mRequestData.get("payer[email]", ""); mFirstName = mRequestData.get("payer[first_name]", ""); mLastName = mRequestData.get("payer[last_name]", ""); - auto newUser = controller::User::create(mEmail, mFirstName, mLastName); + auto newUser = controller::User::create(mEmail, mFirstName, mLastName, 0); /* printf("LastName: %s\n", mLastName.data()); for (int i = 0; i < mLastName.size(); i++) { diff --git a/src/cpp/HTTPInterface/Error500Page.cpp b/src/cpp/HTTPInterface/Error500Page.cpp index e36e1da31..4d2c6ec0f 100644 --- a/src/cpp/HTTPInterface/Error500Page.cpp +++ b/src/cpp/HTTPInterface/Error500Page.cpp @@ -36,9 +36,9 @@ void Error500Page::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne const char* pageName = "Error"; response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); - Poco::AutoPtr user; + Poco::AutoPtr user; if(mSession) { - auto user = mSession->getUser(); + auto user = mSession->getNewUser(); } // begin include header_old.cpsp responseStream << "\n"; @@ -111,7 +111,7 @@ void Error500Page::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne if(mSession) { responseStream << "\n"; responseStream << "\t\t"; #line 21 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\Error500.cpsp" - responseStream << ( mSession->getErrorsHtml() ); + responseStream << ( mSession->getErrorsHtmlNewFormat() ); responseStream << "\n"; responseStream << "\t"; #line 22 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\Error500.cpsp" @@ -121,7 +121,7 @@ void Error500Page::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne if(!user.isNull()) { responseStream << "\n"; responseStream << "\t\t"; #line 24 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\Error500.cpsp" - responseStream << ( user->getErrorsHtml() ); + responseStream << ( user->getModel()->getErrorsHtmlNewFormat() ); responseStream << " \n"; responseStream << "\t"; #line 25 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\Error500.cpsp" diff --git a/src/cpp/HTTPInterface/LoginPage.cpp b/src/cpp/HTTPInterface/LoginPage.cpp index e0b586aea..dd99071af 100644 --- a/src/cpp/HTTPInterface/LoginPage.cpp +++ b/src/cpp/HTTPInterface/LoginPage.cpp @@ -47,8 +47,8 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: auto langCatalog = lm->getFreeCatalog(lang); std::string presetEmail(""); - if(mSession && mSession->getUser()) { - presetEmail = mSession->getUser()->getEmail(); + if(mSession && mSession->getNewUser()) { + presetEmail = mSession->getNewUser()->getModel()->getEmail(); } if(!form.empty()) { @@ -135,6 +135,9 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: } sm->deleteLoginCookies(request, response); break; + case USER_NO_GROUP: + response.redirect(ServerConfig::g_serverPath + "/userUpdateGroup"); + return; case USER_NO_PRIVATE_KEY: case USER_COMPLETE: case USER_EMAIL_NOT_ACTIVATED: @@ -234,11 +237,11 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
    "; // end include header.cpsp responseStream << "\n"; -#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "\n"; responseStream << "
    \n"; @@ -272,22 +275,22 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "\n"; responseStream << "
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t\t\tgettext("E-Mail") ); responseStream << "\" value=\""; -#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( presetEmail ); responseStream << "\"/>\n"; responseStream << "\t\t\tgettext("Password") ); responseStream << "\" />\n"; responseStream << "\t\t \n"; responseStream << "\t\t\n"; @@ -295,25 +298,25 @@ void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net:: responseStream << "
    \n"; responseStream << "
    \n"; responseStream << "\t

    "; -#line 173 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( langCatalog->gettext("You haven't any account yet? Please follow the link to create one.") ); responseStream << "

    \n"; responseStream << "\t \n"; responseStream << "\t\t\t"; -#line 175 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" +#line 178 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\login.cpsp" responseStream << ( langCatalog->gettext("Create New Account") ); responseStream << "\n"; responseStream << "\t\t \n"; responseStream << "\t
    \n"; responseStream << "\t\t\n"; diff --git a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp index b31e742c0..a83d89349 100644 --- a/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp +++ b/src/cpp/HTTPInterface/PageRequestHandlerFactory.cpp @@ -7,7 +7,7 @@ #include "ConfigPage.h" #include "LoginPage.h" -#include "RegisterPage.h" +//#include "RegisterPage.h" #include "HandleFileRequest.h" #include "DashboardPage.h" #include "CheckEmailPage.h" @@ -16,6 +16,7 @@ #include "ElopageWebhook.h" #include "ElopageWebhookLight.h" #include "UpdateUserPasswordPage.h" +#include "UserUpdateGroupPage.h" #include "Error500Page.h" #include "CheckTransactionPage.h" #include "ResetPassword.h" @@ -154,13 +155,9 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c s->setLastReferer(externReferer); } model::table::User* userModel = nullptr; - auto user = s->getUser(); auto newUser = s->getNewUser(); if (newUser) userModel = newUser->getModel(); - if (s->errorCount() || (!user.isNull() && user->errorCount()) || (userModel && userModel->errorCount())) { - if (!user.isNull() && user->errorCount()) { - s->getErrors(user); - } + if (s->errorCount() || (userModel && userModel->errorCount())) { if (userModel && userModel->errorCount()) { s->getErrors(userModel); } @@ -174,6 +171,12 @@ Poco::Net::HTTPRequestHandler* PageRequestHandlerFactory::createRequestHandler(c pageRequestHandler->setProfiler(timeUsed); return pageRequestHandler; } + if (url_first_part == "/userUpdateGroup") { + auto pageRequestHandler = new UserUpdateGroupPage(s); + pageRequestHandler->setProfiler(timeUsed); + return pageRequestHandler; + } + if (url_first_part == "/transform_passphrase") { auto pageRequestHandler = new TranslatePassphrase(s); pageRequestHandler->setProfiler(timeUsed); diff --git a/src/cpp/HTTPInterface/PassphrasePage.cpp b/src/cpp/HTTPInterface/PassphrasePage.cpp index 39a353e4a..bec72a609 100644 --- a/src/cpp/HTTPInterface/PassphrasePage.cpp +++ b/src/cpp/HTTPInterface/PassphrasePage.cpp @@ -9,7 +9,7 @@ #include "../SingletonManager/SessionManager.h" #include "../SingletonManager/LanguageManager.h" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" #include "../ServerConfig.h" //#include "Poco/Net/HTTPServerParams.h" @@ -89,13 +89,15 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: auto registerKeyChoice = form.get("passphrase", "no"); std::string oldPassphrase = ""; if (registerKeyChoice == "no") { - auto oldPassphrase = KeyPair::filterPassphrase(form.get("passphrase-existing", "")); + auto oldPassphrase = Passphrase::filter(form.get("passphrase-existing", "")); if(oldPassphrase != "") { - if (User::validatePassphrase(oldPassphrase, &wordSource)) { + auto word_source = Passphrase::detectMnemonic(oldPassphrase); + if (word_source) { // passphrase is valid if(PAGE_FORCE_ASK_PASSPHRASE == state) { - auto compareResult = mSession->comparePassphraseWithSavedKeys(oldPassphrase, wordSource); + + auto compareResult = mSession->comparePassphraseWithSavedKeys(oldPassphrase, word_source); if(-2 == compareResult) { response.redirect(ServerConfig::g_serverPath + "/error500"); return; @@ -117,7 +119,8 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: } } else if (registerKeyChoice == "yes") { - mSession->generatePassphrase(); + auto passphrase = Passphrase::generate(wordSource); + mSession->setPassphrase(passphrase); } } } @@ -125,7 +128,7 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: // double check passphrase auto passphrase = mSession->getOldPassphrase(); auto langWordSource = wordSource; - if("" != passphrase && !User::validatePassphrase(passphrase, &wordSource)) { + if("" != passphrase && !Passphrase::detectMnemonic(passphrase)) { addError(new Error("PassphrasePage", "Invalid Passphrase after double check")); addError(new ParamError("PassphrasePage", "passphrase", passphrase.data())); if(!mSession->getNewUser().isNull()) { @@ -138,8 +141,8 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: } //printf("wordSource: %d, langWordSource: %d\n", (int)wordSource, (int)langWordSource); if(wordSource != langWordSource) { - mSession->generatePassphrase(); - User::validatePassphrase(passphrase, &wordSource); + //mSession->generatePassphrase(); + mSession->setPassphrase(Passphrase::generate(wordSource)); } if(mSession->getSessionState() == SESSION_STATE_PASSPHRASE_GENERATED && state != PAGE_ASK_ENSURE_PASSPHRASE) { @@ -159,7 +162,7 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: #line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" bool withMaterialIcons = false; -#line 138 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 141 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" withMaterialIcons = true; std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; @@ -251,9 +254,9 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "
    "; // end include login_header.cpsp responseStream << "\n"; -#line 139 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 142 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" if(state == PAGE_ASK_ENSURE_PASSPHRASE) { responseStream << "
    "; -#line 139 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 142 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" } responseStream << "\n"; responseStream << "\t"; // begin include flags.cpsp @@ -283,93 +286,93 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "
    "; // end include flags.cpsp responseStream << "\n"; -#line 141 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" if(state == PAGE_ASK_ENSURE_PASSPHRASE) { responseStream << "
    "; -#line 141 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" } responseStream << "\n"; responseStream << "
    \n"; responseStream << "\t

    "; -#line 143 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( pageTitle ); responseStream << ": "; -#line 143 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( pageSubtitle ); responseStream << "

    \n"; responseStream << "\t"; -#line 144 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 147 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" if(state == PAGE_SHOW_PASSPHRASE) { responseStream << "\n"; responseStream << "\t\t

    "; -#line 145 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 148 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Passphrase abschreiben") ); responseStream << "

    \n"; responseStream << "\t"; -#line 146 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 149 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" } responseStream << "\n"; responseStream << "
    \n"; responseStream << "
    \n"; responseStream << "\t
    \n"; responseStream << "\t"; -#line 150 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 153 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" if(state == PAGE_SHOW_PASSPHRASE) { responseStream << "\n"; responseStream << "\t
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t\t\t
    \n"; responseStream << "\t\t\t
    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t
    "; -#line 156 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 159 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Was ist eine Passphrase?") ); responseStream << "
    \n"; responseStream << "\t\t\t\t

    "; -#line 157 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 160 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Deine Passphrase besteht aus den im grünen Feld angezeigten Wörtern.") ); responseStream << "

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

    "; -#line 158 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 161 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Sie dient deiner Sicherheit.") ); responseStream << "

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

    "; -#line 159 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 162 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Du brauchst deine Passphrase um dein Konto wiederherzustellen, wenn du mal dein Passwort vergessen haben solltest.") ); responseStream << "

    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t
    "; -#line 161 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 164 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Deine Passphrase (Groß/Kleinschreibung beachten)") ); responseStream << ":
    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t

    "; -#line 163 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" - responseStream << ( mSession->getPassphrase() ); +#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" + responseStream << ( mSession->getPassphrase()->getString() ); responseStream << "

    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t
    "; -#line 166 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Was zu tun ist:") ); responseStream << "
    \n"; responseStream << "\t\t\t\t

    "; -#line 167 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 170 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Schreibe dir die obenstehende Passphrase von Hand auf ein Blatt Papier!") ); responseStream << "

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

    "; -#line 168 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 171 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Speichere sie auf keinen Fall auf deinem Rechner oder Mobilgerät!!") ); responseStream << "

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

    "; -#line 169 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 172 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" responseStream << ( gettext("Bewahre sie an einem sicheren Ort auf!") ); responseStream << "

    \n"; responseStream << "\t\t\t\t
    \n"; responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t
    \n"; @@ -377,7 +380,7 @@ void PassphrasePage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: responseStream << "\t\t
    \n"; responseStream << "\t
    \n"; responseStream << "\t "; -#line 176 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" +#line 179 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\passphrase.cpsp" } else if(state == PAGE_ASK_ENSURE_PASSPHRASE) { responseStream << "\n"; responseStream << "\t \n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << "
    \n"; - responseStream << "\t

    Login Server in Entwicklung

    \n"; - responseStream << "\t

    Alpha "; -#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_old.cpsp" - responseStream << ( ServerConfig::g_versionString ); - responseStream << "

    \n"; - responseStream << "
    \n"; - // end include header_old.cpsp - responseStream << "\n"; - responseStream << "
    \n"; - responseStream << "\t

    Einen neuen Account anlegen

    \n"; - responseStream << "\t"; -#line 45 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\register.cpsp" - responseStream << ( getErrorsHtml() ); - responseStream << "\n"; - responseStream << "\t"; -#line 46 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\register.cpsp" - if(!form.empty() && userReturned) { responseStream << "\n"; - responseStream << "\t\t
    \n"; - responseStream << "\t\t\t
    \n"; - responseStream << "\t\t\t\tDeine Anmeldung wird verarbeitet und es wird dir eine E-Mail zugeschickt. \n"; - responseStream << "\t\t\t\tWenn sie da ist, befolge ihren Anweisungen. \n"; - responseStream << "\t\t\t
    \n"; - responseStream << "\t\t
    \n"; - responseStream << "\t"; -#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\register.cpsp" - } else { responseStream << "\n"; - responseStream << "\t\n"; - responseStream << "\t\t\n"; - responseStream << "\t\t
    \n"; - responseStream << "\t\t\tAccount anlegen\n"; - responseStream << "\t\t\t

    Bitte gebe deine Daten um einen Account anzulegen

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

    \n"; - responseStream << "\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\t\n"; - responseStream << "\t\t\t\t\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

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

    \n"; - responseStream << "\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\t\n"; - responseStream << "\t\t\t\t\n"; - responseStream << "\t\t\t

    \n"; - responseStream << "\t\t
    \n"; - responseStream << "\t\t\n"; - responseStream << "\t\t\n"; - responseStream << "\t\n"; - responseStream << "\t"; -#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\register.cpsp" - } responseStream << "\n"; - responseStream << "
    \n"; - // begin include footer.cpsp - responseStream << "
    \n"; - responseStream << "

    Copyright © Gradido 2020

    \n"; - responseStream << "
    \n"; - responseStream << "
    \n"; - responseStream << "
    \n"; - responseStream << " "; -#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" - responseStream << ( mTimeProfiler.string() ); - responseStream << "\n"; - responseStream << "
    \n"; - responseStream << "
    \n"; - responseStream << "

    Login Server in Entwicklung

    \n"; - responseStream << "

    Alpha "; -#line 10 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" - responseStream << ( ServerConfig::g_versionString ); - responseStream << "

    \n"; - responseStream << "
    \n"; - responseStream << "
    \n"; - responseStream << "\n"; - responseStream << "\n"; - responseStream << ""; - // end include footer.cpsp - responseStream << "\n"; - if (_compressResponse) _gzipStream.close(); -} diff --git a/src/cpp/HTTPInterface/RegisterPage.h b/src/cpp/HTTPInterface/RegisterPage.h deleted file mode 100644 index 7dc16970a..000000000 --- a/src/cpp/HTTPInterface/RegisterPage.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef RegisterPage_INCLUDED -#define RegisterPage_INCLUDED - - -#include "Poco/Net/HTTPRequestHandler.h" - - -#include "PageRequestMessagedHandler.h" - - -class RegisterPage: public PageRequestMessagedHandler -{ -public: - void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); -}; - - -#endif // RegisterPage_INCLUDED diff --git a/src/cpp/HTTPInterface/SaveKeysPage.cpp b/src/cpp/HTTPInterface/SaveKeysPage.cpp index 12064f812..3d8d79b67 100644 --- a/src/cpp/HTTPInterface/SaveKeysPage.cpp +++ b/src/cpp/HTTPInterface/SaveKeysPage.cpp @@ -40,7 +40,8 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne const char* pageName = "Daten auf Server speichern?"; bool hasErrors = mSession->errorCount() > 0; // crypto key only in memory, if user has tipped in his passwort in this session - bool hasPassword = mSession->getUser()->hasCryptoKey(); + auto user = mSession->getNewUser(); + bool hasPassword = user->getModel()->hasPrivateKeyEncrypted(); PageState state = PAGE_ASK; auto uri_start = ServerConfig::g_php_serverPath;//request.serverParams().getServerName(); @@ -161,11 +162,11 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne responseStream << "
    \n"; responseStream << "\t

    Daten speichern

    \n"; responseStream << "\t"; -#line 75 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 76 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" responseStream << ( getErrorsHtml() ); responseStream << "\n"; responseStream << "\t"; -#line 76 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 77 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" if(state == PAGE_ASK) { responseStream << "\n"; responseStream << "\t
    \n"; responseStream << "\t\t
    \n"; @@ -180,7 +181,7 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne responseStream << "\t\t\t\t\n"; responseStream << "\t\t\t

    \n"; responseStream << "\t\t\t"; -#line 89 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 90 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" if(!hasPassword) { responseStream << "\n"; responseStream << "\t\t\t\t

    Ich brauche nochmal dein Passwort wenn du dich für ja entscheidest.

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

    \n"; @@ -188,7 +189,7 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne responseStream << "\t\t\t\t\t\n"; responseStream << "\t\t\t\t

    \n"; responseStream << "\t\t\t"; -#line 95 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 96 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" } responseStream << "\n"; responseStream << "\t\t\t

    \n"; responseStream << "\t\t\t\t\n"; @@ -213,15 +214,15 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne responseStream << "\t\t\n"; responseStream << "\t\n"; responseStream << "\t"; -#line 118 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 119 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" } else if(state == PAGE_SHOW_PUBKEY) { responseStream << "\n"; responseStream << "\t\t

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

    "; -#line 120 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 121 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" responseStream << ( gettext("Daten gespeichert!") ); responseStream << "

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

    "; -#line 121 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 122 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" responseStream << ( gettext("Deine Daten wurden verschlüsselt und gespeichert.") ); responseStream << "

    \n"; responseStream << "\t\t\t\n"; @@ -229,27 +230,27 @@ void SaveKeysPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Ne responseStream << "\t\t\t\n"; responseStream << "\t\t\tZurück zur Startseite\n"; responseStream << "\t\t
    \n"; responseStream << "\t"; -#line 130 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 131 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" } else if(state == PAGE_ERROR) { responseStream << "\n"; responseStream << "\t\t
    \n"; responseStream << "\t\t\t

    Ein Fehler trat auf, bitte versuche es erneut oder wende dich an den Server-Admin

    \n"; responseStream << "\t\t\t"; -#line 133 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 134 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" responseStream << ( mSession->getSessionStateString() ); responseStream << "\n"; responseStream << "\t\t
    \n"; responseStream << "\t"; -#line 135 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" +#line 136 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\saveKeys.cpsp" } responseStream << "\n"; responseStream << "
    \n"; // begin include footer.cpsp diff --git a/src/cpp/HTTPInterface/TranslatePassphrase.cpp b/src/cpp/HTTPInterface/TranslatePassphrase.cpp index 512383518..3b14f9a2c 100644 --- a/src/cpp/HTTPInterface/TranslatePassphrase.cpp +++ b/src/cpp/HTTPInterface/TranslatePassphrase.cpp @@ -7,7 +7,7 @@ #line 7 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" #include "../ServerConfig.h" #line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header.cpsp" @@ -50,16 +50,17 @@ void TranslatePassphrase::handleRequest(Poco::Net::HTTPServerRequest& request, P { inputPassphrase = form.get("inputPassphrase", ""); - auto localPassphrase = KeyPair::filterPassphrase(inputPassphrase); + auto localPassphrase = Passphrase::filter(inputPassphrase); auto btnGenerate = form.get("btnGenerate", ""); if("" != btnGenerate) { - mSession->generatePassphrase(); - localPassphrase = mSession->getOldPassphrase(); + auto passphrase_gen = Passphrase::generate(wordSource); + + localPassphrase = passphrase_gen->getString(); inputPassphrase = localPassphrase; } - - if(localPassphrase != "" && !User::validatePassphrase(localPassphrase, &wordSource)) { + auto passphrase_object = Passphrase::create(localPassphrase, wordSource); + if(localPassphrase != "" && passphrase_object.isNull() || !passphrase_object->checkIfValid()) { addError(new Error( gettext("Fehler"), gettext("Diese Passphrase ist ungültig, bitte überprüfen oder neu generieren (lassen).") @@ -70,7 +71,8 @@ void TranslatePassphrase::handleRequest(Poco::Net::HTTPServerRequest& request, P } else { targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]; } - passphrase = KeyPair::passphraseTransform(localPassphrase, wordSource, targetSource); + auto transformed_passphrase_obj = passphrase_object->transform(targetSource); + passphrase = transformed_passphrase_obj->getString(); } @@ -197,7 +199,7 @@ void TranslatePassphrase::handleRequest(Poco::Net::HTTPServerRequest& request, P responseStream << "\n"; responseStream << "
    \n"; responseStream << "\t

    "; -#line 59 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 61 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" responseStream << ( gettext("Passphrase umwandeln") ); responseStream << "

    \n"; responseStream << "
    \n"; @@ -208,57 +210,57 @@ void TranslatePassphrase::handleRequest(Poco::Net::HTTPServerRequest& request, P responseStream << "\t
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t\t
    "; -#line 67 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 69 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" responseStream << ( gettext("Was zu tun ist:") ); responseStream << "
    \n"; responseStream << "\t\t

    "; -#line 68 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 70 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" responseStream << ( gettext("Kopiere/schreibe deine Passphrase in die Textbox und du bekommst sie in die jeweils andere Sprache umgewandelt.") ); responseStream << "

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

    "; -#line 69 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 71 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" responseStream << ( gettext("Du kannst mit beiden Varianten dein Konto wiederherstellen oder dein Passwort ändern.") ); responseStream << "

    \n"; responseStream << "\t\t
    \n"; responseStream << "\t
    \n"; responseStream << "\t
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t\t\t\n"; responseStream << "\t\t
    \n"; responseStream << "\t\t \n"; responseStream << "\t\t "; -#line 78 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 80 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" if(model::table::ROLE_ADMIN == role) { responseStream << "\n"; responseStream << "\t\t\t\n"; responseStream << "\t\t "; -#line 80 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 82 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" } responseStream << "\n"; responseStream << "\t\t\n"; responseStream << "\t
    \n"; responseStream << "\t "; -#line 83 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 85 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" if(passphrase != "") { responseStream << "\n"; responseStream << "\t\t
    \n"; responseStream << "\t\t\t
    \n"; responseStream << "\t\t\t\t
    Umgewandelte Passphrase:
    \n"; responseStream << "\t\t\t\t

    "; -#line 87 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 89 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" responseStream << ( passphrase ); responseStream << "

    \n"; responseStream << "\t\t\t
    \n"; responseStream << "\t\t
    \n"; responseStream << "\t "; -#line 90 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" +#line 92 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\translatePassphrase.cpsp" } responseStream << "\n"; responseStream << "\t
    \n"; responseStream << "\t
    \n"; diff --git a/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp b/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp new file mode 100644 index 000000000..f41928116 --- /dev/null +++ b/src/cpp/HTTPInterface/UserUpdateGroupPage.cpp @@ -0,0 +1,209 @@ +#include "UserUpdateGroupPage.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\\userUpdateGroup.cpsp" + + +#include "../controller/Group.h" +#include "../SingletonManager/SessionManager.h" + +enum PageState { + PAGE_STATE_OVERVIEW, + PAGE_STATE_REQUEST_IS_RUNNING +}; + +#line 1 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + +#include "../ServerConfig.h" + + +UserUpdateGroupPage::UserUpdateGroupPage(Session* arg): + SessionHTTPRequestHandler(arg) +{ +} + + +void UserUpdateGroupPage::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 17 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + + const char* pageName = gettext("Gruppe wählen"); + auto user = mSession->getNewUser(); + auto sm = SessionManager::getInstance(); + PageState state = PAGE_STATE_OVERVIEW; + + if(!form.empty()) { + } + + auto groups = controller::Group::listAll(); + + +#line 3 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + + bool withMaterialIcons = false; + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << "\n"; + // begin include header_large.cpsp + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: "; +#line 11 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + responseStream << ( pageName ); + responseStream << "\n"; + responseStream << "\n"; +#line 13 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + if(withMaterialIcons) { responseStream << "\n"; + responseStream << "\n"; +#line 15 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\header_large.cpsp" + } responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "
    \n"; + responseStream << "\t\t
    \n"; + responseStream << "\t\t\t
    \n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t
    \n"; + responseStream << "\t\t
    \n"; + responseStream << "\t\t
    "; + // end include header_large.cpsp + responseStream << "\n"; +#line 30 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( getErrorsHtml() ); + responseStream << "\n"; + responseStream << "
    \n"; + responseStream << "\t"; +#line 32 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + if(PAGE_STATE_OVERVIEW == state ) { responseStream << "\n"; + responseStream << "
    \n"; + responseStream << "

    "; +#line 34 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Gruppe wählen") ); + responseStream << "

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

    "; +#line 36 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Bitte wähle die Gruppe/Gemeinschaft aus, zu der du gehörst.") ); + responseStream << "

    \n"; + responseStream << "\t

    "; +#line 37 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Du bekommst eine Bestätigungsmail, nachdem dein Beitritt bestätigt wurde.") ); + responseStream << "

    \n"; + responseStream << "\t
    \n"; + responseStream << "\t\t
    \n"; + responseStream << "\t\t\t
    \n"; + responseStream << "\t\t\t\t
    "; +#line 41 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Auswahl") ); + responseStream << "
    \n"; + responseStream << "\t\t\t\t
    Name
    \n"; + responseStream << "\t\t\t\t
    Alias
    \n"; + responseStream << "\t\t\t\t
    Url
    \n"; + responseStream << "\t\t\t\t
    "; +#line 45 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( gettext("Description") ); + responseStream << "
    \n"; + responseStream << "\t\t\t
    \n"; + responseStream << "\t\t\t"; +#line 47 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + for(auto it = groups.begin(); it != groups.end(); it++) { + auto group_model = (*it)->getModel(); responseStream << "\n"; + responseStream << "\t\t\t\t
    \n"; + responseStream << "\t\t\t\t\t
    getID()); + responseStream << "\" />
    \n"; + responseStream << "\t\t\t\t\t
    "; +#line 51 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( group_model->getName() ); + responseStream << "
    \n"; + responseStream << "\t\t\t\t\t
    "; +#line 52 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( group_model->getAlias() ); + responseStream << "
    \n"; + responseStream << "\t\t\t\t\t
    "; +#line 53 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( group_model->getUrl() ); + responseStream << "
    \n"; + responseStream << "\t\t\t\t\t
    "; +#line 54 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + responseStream << ( group_model->getDescription()); + responseStream << "
    \n"; + responseStream << "\t\t\t\t
    \n"; + responseStream << "\t\t\t"; +#line 56 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + } responseStream << "\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
    \n"; + responseStream << "\t\n"; + responseStream << "\t"; +#line 60 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\userUpdateGroup.cpsp" + } responseStream << "\n"; + responseStream << "
    \n"; + // begin include footer.cpsp + responseStream << "
    \n"; + responseStream << "

    Copyright © Gradido 2020

    \n"; + responseStream << "
    \n"; + responseStream << "
    \n"; + responseStream << "
    \n"; + responseStream << " "; +#line 6 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\footer.cpsp" + responseStream << ( mTimeProfiler.string() ); + responseStream << "\n"; + responseStream << "
    \n"; + responseStream << "
    \n"; + responseStream << "

    Login Server in Entwicklung

    \n"; + responseStream << "

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

    \n"; + responseStream << "
    \n"; + responseStream << "
    \n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << ""; + // end include footer.cpsp + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/UserUpdateGroupPage.h b/src/cpp/HTTPInterface/UserUpdateGroupPage.h new file mode 100644 index 000000000..5b1e9a7d1 --- /dev/null +++ b/src/cpp/HTTPInterface/UserUpdateGroupPage.h @@ -0,0 +1,20 @@ +#ifndef UserUpdateGroupPage_INCLUDED +#define UserUpdateGroupPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +#include "SessionHTTPRequestHandler.h" + + +class UserUpdateGroupPage: public SessionHTTPRequestHandler +{ +public: + UserUpdateGroupPage(Session*); + + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // UserUpdateGroupPage_INCLUDED diff --git a/src/cpp/ImportantTests.cpp b/src/cpp/ImportantTests.cpp index d321bab5f..33c7d0f26 100644 --- a/src/cpp/ImportantTests.cpp +++ b/src/cpp/ImportantTests.cpp @@ -2,7 +2,7 @@ #include #include "ServerConfig.h" -#include "Crypto/KeyPair.h" +//#include "Crypto/KeyPair.h" #include "Crypto/KeyPairEd25519.h" #include "lib/DataTypeConverter.h" @@ -38,27 +38,36 @@ namespace ImportantTests { // test old key pair implementation - KeyPair keys; + //KeyPair keys; bool errorsOccured = false; - std::string filtered_1_de = KeyPair::filterPassphrase(passphrase_1_de); - keys.generateFromPassphrase(filtered_1_de.data(), de_words); - if (keys.getPubkeyHex() != passphrase_1_pubkey_hex) { + std::string filtered_1_de = Passphrase::filter(passphrase_1_de); + KeyPairEd25519* keys = nullptr; + keys = KeyPairEd25519::create(Passphrase::create(filtered_1_de, de_words)); + std::string public_key_hex = keys->getPublicKeyHex(); + + if (std::string(public_key_hex.data(), public_key_hex.size() - 1) != passphrase_1_pubkey_hex) { printf("1 de incorrect\n"); errorsOccured = true; } - keys.generateFromPassphrase(passphrase_1_en.data(), en_words); - if (keys.getPubkeyHex() != passphrase_1_pubkey_hex) { + delete keys; + keys = KeyPairEd25519::create(Passphrase::create(passphrase_1_en, en_words)); + public_key_hex = keys->getPublicKeyHex(); + if (std::string(public_key_hex.data(), public_key_hex.size() - 1) != passphrase_1_pubkey_hex) { printf("1 en incorrect\n"); errorsOccured = true; } - std::string filtered_2_de = KeyPair::filterPassphrase(passphrase_2_de); - keys.generateFromPassphrase(filtered_2_de.data(), de_words); - if (keys.getPubkeyHex() != passphrase_2_pubkey_hex) { + std::string filtered_2_de = Passphrase::filter(passphrase_2_de); + delete keys; + keys = KeyPairEd25519::create(Passphrase::create(filtered_2_de, de_words)); + public_key_hex = keys->getPublicKeyHex(); + if (std::string(public_key_hex.data(), public_key_hex.size() - 1) != passphrase_2_pubkey_hex) { printf("2 de incorrect\n"); errorsOccured = true; } - keys.generateFromPassphrase(passphrase_2_en.data(), en_words); - if (keys.getPubkeyHex() != passphrase_2_pubkey_hex) { + delete keys; + keys = KeyPairEd25519::create(Passphrase::create(passphrase_2_en, en_words)); + public_key_hex = keys->getPublicKeyHex(); + if (std::string(public_key_hex.data(), public_key_hex.size() - 1) != passphrase_2_pubkey_hex) { printf("2 en incorrect\n"); errorsOccured = true; } diff --git a/src/cpp/JSONInterface/JsonCreateUser.cpp b/src/cpp/JSONInterface/JsonCreateUser.cpp index 63d1cf1f4..a13832853 100644 --- a/src/cpp/JSONInterface/JsonCreateUser.cpp +++ b/src/cpp/JSONInterface/JsonCreateUser.cpp @@ -12,6 +12,7 @@ Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params) std::string first_name; std::string last_name; int emailType; + int group_id; auto em = EmailManager::getInstance(); // if is json object @@ -27,6 +28,7 @@ Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params) paramJsonObject->get("first_name").convert(first_name); paramJsonObject->get("last_name").convert(last_name); paramJsonObject->get("emailType").convert(emailType); + paramJsonObject->get("group_id").convert(group_id); } catch (Poco::Exception& ex) { return stateError("json exception", ex.displayText()); @@ -45,7 +47,7 @@ Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params) } // create user - user = controller::User::create(email, first_name, last_name); + user = controller::User::create(email, first_name, last_name, group_id); auto userModel = user->getModel(); if (!userModel->insertIntoDB(true)) { userModel->sendErrorsAsEmail(); diff --git a/src/cpp/JSONInterface/JsonTransaction.cpp b/src/cpp/JSONInterface/JsonTransaction.cpp index 777fca295..7e09dd55d 100644 --- a/src/cpp/JSONInterface/JsonTransaction.cpp +++ b/src/cpp/JSONInterface/JsonTransaction.cpp @@ -33,10 +33,6 @@ Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params) if (!paramJsonObject->isNull("balance")) { paramJsonObject->get("balance").convert(balance); if (balance) { - auto u = session->getUser(); - if (u) { - u->setBalance(balance); - } auto nu = session->getNewUser(); if (!nu.isNull()) { nu->setBalance(balance); diff --git a/src/cpp/controller/User.cpp b/src/cpp/controller/User.cpp index ba07a066c..95549687a 100644 --- a/src/cpp/controller/User.cpp +++ b/src/cpp/controller/User.cpp @@ -21,6 +21,7 @@ namespace controller { : mPassword(nullptr), mGradidoKeyPair(nullptr), mCanDecryptPrivateKey(false), mGradidoCurrentBalance(0) { mDBModel = dbModel; + } User::~User() @@ -39,9 +40,9 @@ namespace controller { return Poco::AutoPtr(user); } - Poco::AutoPtr User::create(const std::string& email, const std::string& first_name, const std::string& last_name, Poco::UInt64 passwordHashed/* = 0*/, std::string languageKey/* = "de"*/) + Poco::AutoPtr User::create(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed/* = 0*/, std::string languageKey/* = "de"*/) { - auto db = new model::table::User(email, first_name, last_name, passwordHashed, languageKey); + auto db = new model::table::User(email, first_name, last_name, group_id, passwordHashed, languageKey); auto user = new User(db); return Poco::AutoPtr(user); } @@ -327,6 +328,41 @@ namespace controller { return -1; } + /* + USER_EMPTY, + USER_LOADED_FROM_DB, + USER_PASSWORD_INCORRECT, + USER_PASSWORD_ENCRYPTION_IN_PROCESS, + USER_EMAIL_NOT_ACTIVATED, + USER_NO_KEYS, + USER_NO_PRIVATE_KEY, + USER_NO_GROUP, + USER_KEYS_DONT_MATCH, + USER_COMPLETE, + USER_DISABLED + */ + UserState User::getUserState() + { + std::unique_lock _lock(mSharedMutex); + auto model = getModel(); + if (!model->getID() && model->getEmail() == "") { + return USER_EMPTY; + } + if (!model->hasPrivateKeyEncrypted() && !model->hasPublicKey()) { + return USER_NO_KEYS; + } + if (!model->hasPrivateKeyEncrypted()) { + return USER_NO_PRIVATE_KEY; + } + if (!model->getGroupId()) { + return USER_NO_GROUP; + } + if (!model->isEmailChecked()) { + return USER_EMAIL_NOT_ACTIVATED; + } + return USER_COMPLETE; + } + int User::checkIfVerificationEmailsShouldBeResend(const Poco::Util::Timer& timer) { diff --git a/src/cpp/controller/User.h b/src/cpp/controller/User.h index a400d2ff5..1b60852b5 100644 --- a/src/cpp/controller/User.h +++ b/src/cpp/controller/User.h @@ -9,6 +9,21 @@ #include "TableControllerBase.h" +enum UserState +{ + USER_EMPTY, + USER_LOADED_FROM_DB, + USER_PASSWORD_INCORRECT, + USER_PASSWORD_ENCRYPTION_IN_PROCESS, + USER_EMAIL_NOT_ACTIVATED, + USER_NO_KEYS, + USER_NO_PRIVATE_KEY, + USER_NO_GROUP, + USER_KEYS_DONT_MATCH, + USER_COMPLETE, + USER_DISABLED +}; + namespace controller { @@ -26,7 +41,7 @@ namespace controller { ~User(); static Poco::AutoPtr create(); - static Poco::AutoPtr create(const std::string& email, const std::string& first_name, const std::string& last_name, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); + static Poco::AutoPtr create(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); static std::vector search(const std::string& searchString); @@ -96,6 +111,9 @@ namespace controller { //! \return -1 = stored pubkey and private key didn't match int setNewPassword(const std::string& password); + //! \brief calculate user state + UserState getUserState(); + //! \brief return AuthenticatedEncryption Auto Pointer inline const Poco::AutoPtr getPassword() { std::shared_lock _lock(mSharedMutex); diff --git a/src/cpp/controller/UserBackup.cpp b/src/cpp/controller/UserBackup.cpp index 9a152592f..88bc3f682 100644 --- a/src/cpp/controller/UserBackup.cpp +++ b/src/cpp/controller/UserBackup.cpp @@ -48,17 +48,12 @@ namespace controller { } - Poco::SharedPtr UserBackup::getKeyPair() + Poco::SharedPtr UserBackup::getKeyPair() { if (!mKeyPair.isNull()) { return mKeyPair; } - mKeyPair = new KeyPair; - auto model = getModel(); - auto passphrase = model->getPassphrase(); - - mKeyPair->generateFromPassphrase(passphrase); - return mKeyPair; + mKeyPair = createGradidoKeyPair(); } KeyPairEd25519* UserBackup::createGradidoKeyPair() @@ -77,17 +72,17 @@ namespace controller { return ""; } auto passphrase = getModel()->getPassphrase(); - Mnemonic* wordSource = nullptr; - if (KeyPair::validatePassphrase(passphrase, &wordSource)) { - for (int i = 0; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) { - Mnemonic* m = &ServerConfig::g_Mnemonic_WordLists[i]; - if (m == wordSource) { - if (type == i) { - return passphrase; - } - else { - return KeyPair::passphraseTransform(passphrase, m, &ServerConfig::g_Mnemonic_WordLists[type]); - } + auto wordSource = Passphrase::detectMnemonic(passphrase); + for (int i = 0; i < ServerConfig::Mnemonic_Types::MNEMONIC_MAX; i++) { + Mnemonic* m = &ServerConfig::g_Mnemonic_WordLists[i]; + if (m == wordSource) { + if (type == i) { + return passphrase; + } + else { + //return KeyPair::passphraseTransform(passphrase, m, &ServerConfig::g_Mnemonic_WordLists[type]); + auto passphrase_obj = Passphrase::create(passphrase, wordSource); + return passphrase_obj->transform(&ServerConfig::g_Mnemonic_WordLists[type])->getString(); } } } diff --git a/src/cpp/controller/UserBackup.h b/src/cpp/controller/UserBackup.h index a21d1c3ab..f1ab2f95a 100644 --- a/src/cpp/controller/UserBackup.h +++ b/src/cpp/controller/UserBackup.h @@ -2,7 +2,6 @@ #define GRADIDO_LOGIN_SERVER_CONTROLLER_USER_BACKUPS_INCLUDE #include "../model/table/UserBackup.h" -#include "../Crypto/KeyPair.h" #include "../Crypto/KeyPairEd25519.h" #include "Poco/SharedPtr.h" @@ -26,7 +25,7 @@ namespace controller { //! depracted //! \return create keyPair from passphrase if not exist, else return existing pointer - Poco::SharedPtr getKeyPair(); + Poco::SharedPtr getKeyPair(); //! \return newly created key pair from passphrase or nullptr if not possible, caller becomes owner of pointer KeyPairEd25519* createGradidoKeyPair(); @@ -38,7 +37,7 @@ namespace controller { protected: UserBackup(model::table::UserBackup* dbModel); - Poco::SharedPtr mKeyPair; + Poco::SharedPtr mKeyPair; }; } diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 2e24e8610..ae3138233 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -34,59 +34,12 @@ using namespace Poco::Data::Keywords; -int WriteEmailVerification::run() -{ - auto em = ErrorManager::getInstance(); - - mEmailVerificationCode->getModel()->setUserId(mUser->getDBId()); - auto emailVerificationModel = mEmailVerificationCode->getModel(); - emailVerificationModel->setUserId(mUser->getDBId()); - if (!emailVerificationModel->insertIntoDB(true) || emailVerificationModel->errorCount() > 0) { - emailVerificationModel->sendErrorsAsEmail(); - return -1; - } - - return 0; -} - -// --------------------------------------------------------------------------------------------------------------- - -int WritePassphraseIntoDB::run() -{ - Profiler timeUsed; - - // TODO: encrypt passphrase, need server admin crypto box pubkey - //int crypto_box_seal(unsigned char *c, const unsigned char *m, - //unsigned long long mlen, const unsigned char *pk); - size_t mlen = mPassphrase.size(); - size_t crypto_size = crypto_box_SEALBYTES + mlen; - - auto em = ErrorManager::getInstance(); - - auto dbSession = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - Poco::Data::Statement insert(dbSession); - insert << "INSERT INTO user_backups (user_id, passphrase) VALUES(?,?)", - use(mUserId), use(mPassphrase); - try { - if (insert.execute() != 1) { - em->addError(new ParamError("WritePassphraseIntoDB::run", "inserting passphrase for user failed", std::to_string(mUserId))); - em->sendErrorsAsEmail(); - } - } - catch (Poco::Exception& ex) { - em->addError(new ParamError("WritePassphraseIntoDB::run", "insert passphrase mysql error", ex.displayText().data())); - em->sendErrorsAsEmail(); - } - - //printf("[WritePassphraseIntoDB] timeUsed: %s\n", timeUsed.string().data()); - return 0; -} // -------------------------------------------------------------------------------------------------------------- Session::Session(int handle) - : mHandleId(handle), mSessionUser(nullptr), mState(SESSION_STATE_EMPTY), mActive(false) + : mHandleId(handle), mState(SESSION_STATE_EMPTY), mActive(false) { } @@ -109,7 +62,6 @@ void Session::reset() //printf("[Session::reset]\n"); lock("Session::reset"); std::unique_lock _lock(mSharedMutex); - mSessionUser.assign(nullptr); mNewUser.assign(nullptr); mEmailVerificationCodeObject.assign(nullptr); @@ -147,7 +99,7 @@ Poco::AutoPtr Session::getEmailVerificationCo return ret; } -bool Session::adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email) +bool Session::adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email, int group_id) { Profiler usedTime; @@ -177,7 +129,7 @@ bool Session::adminCreateUser(const std::string& first_name, const std::string& return false; } - auto newUser = controller::User::create(email, first_name, last_name); + auto newUser = controller::User::create(email, first_name, last_name, group_id); updateTimeout(); @@ -201,128 +153,9 @@ bool Session::adminCreateUser(const std::string& first_name, const std::string& return true; } -// -bool Session::createUser(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password) -{ - Profiler usedTime; - auto sm = SessionManager::getInstance(); - if (!sm->isValid(first_name, VALIDATE_NAME)) { - addError(new Error(gettext("Vorname"), gettext("Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen <>&;")), false); - return false; - } - if (!sm->isValid(last_name, VALIDATE_NAME)) { - addError(new Error(gettext("Nachname"), gettext("Bitte gebe einen Namen an. Mindestens 3 Zeichen, keines folgender Zeichen <>&;")), false); - return false; - } - if (!sm->isValid(email, VALIDATE_EMAIL)) { - addError(new Error(gettext("E-Mail"), gettext("Bitte gebe eine gültige E-Mail Adresse an.")), false); - return false; - } - if (!sm->checkPwdValidation(password, this)) { - return false; - } - /*if (passphrase.size() > 0 && !sm->isValid(passphrase, VALIDATE_PASSPHRASE)) { - addError(new Error("Merkspruch", "Der Merkspruch ist nicht gültig, er besteht aus 24 Wörtern, mit Komma getrennt.")); - return false; - } - if (passphrase.size() == 0) { - //mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]); - mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER]); - } - else { - //mPassphrase = passphrase; - }*/ - // check if user with that email already exist - auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - Poco::Data::Statement select(dbConnection); - select << "SELECT email from users where email = ?;", useRef(email); - try { - if (select.execute() > 0) { - addError(new Error(gettext("E-Mail"), gettext("Für diese E-Mail Adresse gibt es bereits einen Account")), false); - return false; - } - } - catch (Poco::Exception& exc) { - printf("mysql exception: %s\n", exc.displayText().data()); - } - - mSessionUser = new User(email.data(), first_name.data(), last_name.data()); - mNewUser = controller::User::create(email, first_name, last_name); - updateTimeout(); - - // Prepare E-Mail - //UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler)); - //prepareEmail->scheduleTask(prepareEmail); - - // create user crypto key - UniLib::controller::TaskPtr cryptoKeyTask(new UserCreateCryptoKey(mSessionUser, mNewUser, password, ServerConfig::g_CryptoCPUScheduler)); - cryptoKeyTask->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_CRYPTO_KEY_GENERATED, this)); - cryptoKeyTask->scheduleTask(cryptoKeyTask); - - // depends on crypto key, write user record into db - UniLib::controller::TaskPtr writeUserIntoDB(new UserWriteIntoDB(mSessionUser, ServerConfig::g_CPUScheduler, 1)); - writeUserIntoDB->setParentTaskPtrInArray(cryptoKeyTask, 0); - writeUserIntoDB->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_USER_WRITTEN, this)); - writeUserIntoDB->scheduleTask(writeUserIntoDB); - - std::unique_lock _lock(mSharedMutex); - mEmailVerificationCodeObject = controller::EmailVerificationCode::create(model::table::EMAIL_OPT_IN_REGISTER); - UniLib::controller::TaskPtr writeEmailVerification(new WriteEmailVerification(mSessionUser, mEmailVerificationCodeObject, ServerConfig::g_CPUScheduler, 1)); - - writeEmailVerification->setParentTaskPtrInArray(writeUserIntoDB, 0); - writeEmailVerification->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_EMAIL_VERIFICATION_WRITTEN, this)); - writeEmailVerification->scheduleTask(writeEmailVerification); - - - /*printf("LastName: %s\n", last_name.data()); - for (int i = 0; i < last_name.size(); i++) { - char c = last_name.data()[i]; - //printf("%d ", c); - } - //printf("\n\n"); - */ - - // depends on writeUser because need user_id, write email verification into db - /*auto message = new Poco::Net::MailMessage; - Poco::Net::MediaType mt("text", "plain"); - mt.setParameter("charset", "utf-8"); - message->setContentType(mt); - - message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, email)); - message->setSubject(gettext("Gradido: E-Mail Verification")); - std::stringstream ss; - ss << "Hallo " << first_name << " " << last_name << "," << std::endl << std::endl; - ss << "Du oder jemand anderes hat sich soeben mit dieser E-Mail Adresse bei Gradido registriert. " << std::endl; - ss << "Wenn du es warst, klicke bitte auf den Link: " << ServerConfig::g_serverPath << "/checkEmail/" << mEmailVerificationCode << std::endl; - //ss << "oder kopiere den Code: " << mEmailVerificationCode << " selbst dort hinein." << std::endl; - ss << "oder kopiere den obigen Link in Dein Browserfenster." << std::endl; - ss << std::endl; - ss << "Mit freundlichen " << u8"Grüßen" << std::endl; - ss << "Dario, Gradido Server Admin" << std::endl; - - - message->addContent(new Poco::Net::StringPartSource(ss.str())); - */ - //UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1)); - //Email(AutoPtr emailVerification, AutoPtr user, EmailType type); - UniLib::controller::TaskPtr sendEmail(new SendEmailTask(new model::Email(mEmailVerificationCodeObject, mNewUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1)); - //sendEmail->setParentTaskPtrInArray(prepareEmail, 0); - sendEmail->setParentTaskPtrInArray(writeEmailVerification, 0); - sendEmail->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_EMAIL_VERIFICATION_SEND, this)); - sendEmail->scheduleTask(sendEmail); - - // write user into db - // generate and write email verification into db - // send email - - //printf("[Session::createUser] time: %s\n", usedTime.string().data()); - - return true; -} - -bool Session::createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password) +bool Session::createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password, int groupId) { std::unique_lock _lock(mSharedMutex); static const char* function_name = "Session::createUserDirect"; @@ -354,7 +187,7 @@ bool Session::createUserDirect(const std::string& first_name, const std::string& } // user - mNewUser = controller::User::create(email, first_name, last_name); + mNewUser = controller::User::create(email, first_name, last_name, groupId); auto user_model = mNewUser->getModel(); user_model->insertIntoDB(true); auto user_id = user_model->getID(); @@ -429,16 +262,8 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) } auto email_verification_code_model = mEmailVerificationCodeObject->getModel(); assert(email_verification_code_model); - if(email_verification_code_model->getCode() == emailVerificationCode) { - if (mSessionUser && mSessionUser->getDBId() == 0) { - //addError(new Error("E-Mail Verification", "Benutzer wurde nicht richtig gespeichert, bitte wende dich an den Server-Admin")); - em->addError(new Error(funcName, "user exist with 0 as id")); - em->sendErrorsAsEmail(); - - //return false; - return -2; - } - + if(email_verification_code_model->getCode() == emailVerificationCode) + { // load correct user from db if (mNewUser.isNull() || !mNewUser->getModel() || mNewUser->getModel()->getID() != email_verification_code_model->getUserId()) { mNewUser = controller::User::create(); @@ -460,7 +285,6 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) first_email_activation = true; } if (first_email_activation && user_model->isEmailChecked()) { - mSessionUser = new User(mNewUser); addError(new Error(gettext("E-Mail Verification"), gettext("Du hast dein Konto bereits aktiviert!")), false); return 1; @@ -499,28 +323,6 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) return -2; - /*if (updated_rows == 1) { - Poco::Data::Statement delete_row(dbConnection); - delete_row << "DELETE FROM email_opt_in where verification_code = ?", use(emailVerificationCode); - if (delete_row.execute() != 1) { - em->addError(new Error(funcName, "delete from email_opt_in entry didn't work as expected, please check db")); - em->sendErrorsAsEmail(); - } - if (mSessionUser) { - mSessionUser->setEmailChecked(); - mSessionUser->setLanguage(getLanguage()); - } - updateState(SESSION_STATE_EMAIL_VERIFICATION_CODE_CHECKED); - //printf("[%s] time: %s\n", funcName, usedTime.string().data()); - unlock(); - return true; - } - else { - em->addError(new ParamError(funcName, "update user work not like expected, updated row count", updated_rows)); - em->sendErrorsAsEmail(); - }*/ - - } else { addError(new Error(gettext("E-Mail Verification"), gettext("Falscher Code für aktiven Login"))); @@ -537,7 +339,6 @@ int Session::updateEmailVerification(Poco::UInt64 emailVerificationCode) int Session::sendResetPasswordEmail(Poco::AutoPtr user, bool passphraseMemorized) { mNewUser = user; - mSessionUser = new User(user); auto em = EmailManager::getInstance(); std::unique_lock _lock(mSharedMutex); @@ -579,16 +380,17 @@ int Session::sendResetPasswordEmail(Poco::AutoPtr user, bool p return 0; } -int Session::comparePassphraseWithSavedKeys(const std::string& inputPassphrase, Mnemonic* wordSource) +int Session::comparePassphraseWithSavedKeys(const std::string& inputPassphrase, const Mnemonic* wordSource) { - KeyPair keys; + static const char* functionName = "Session::comparePassphraseWithSavedKeys"; if (!wordSource) { addError(new Error(functionName, "wordSource is empty")); sendErrorsAsEmail(); return -2; } - if (!keys.generateFromPassphrase(inputPassphrase.data(), wordSource)) { + auto passphrase = Passphrase::create(inputPassphrase, wordSource); + if (passphrase.isNull() || !passphrase->checkIfValid()) { addError(new ParamError(functionName, "invalid passphrase", inputPassphrase)); if (!mNewUser.isNull() && mNewUser->getModel()) { addError(new ParamError(functionName, "user email", mNewUser->getModel()->getEmail())); @@ -610,9 +412,15 @@ int Session::comparePassphraseWithSavedKeys(const std::string& inputPassphrase, return -1; } } - if (0 == memcmp(userModel->getPublicKey(), keys.getPublicKey(), crypto_sign_PUBLICKEYBYTES)) { - mPassphrase = inputPassphrase; - return 1; + auto keys = KeyPairEd25519::create(passphrase); + if (keys) { + auto cmp_result = memcmp(userModel->getPublicKey(), keys->getPublicKey(), crypto_sign_PUBLICKEYBYTES); + delete keys; + keys = nullptr; + if (0 == cmp_result) { + mPassphrase = inputPassphrase; + return 1; + } } addError(new Error(gettext("Passphrase"), gettext("Das ist nicht die richtige Passphrase.")), false); return 0; @@ -634,13 +442,8 @@ bool Session::startProcessingTransaction(const std::string& proto_message_base64 return false; } } - if (mSessionUser.isNull() || !mSessionUser->getEmail()) { - addError(new Error(funcName, "user is zero")); - unlock(); - return false; - } - Poco::AutoPtr processorTask(new ProcessingTransaction(proto_message_base64, DRMakeStringHash(mSessionUser->getEmail()))); + Poco::AutoPtr processorTask(new ProcessingTransaction(proto_message_base64, DRMakeStringHash(mNewUser->getModel()->getEmail().data()))); processorTask->scheduleTask(processorTask); mProcessingTransactions.push_back(processorTask); unlock(); @@ -723,15 +526,7 @@ size_t Session::getProcessingTransactionCount() return count; } -bool Session::isPwdValid(const std::string& pwd) -{ - if (mSessionUser) { - return mSessionUser->validatePwd(pwd, this); - } - return false; -} - -UserStates Session::loadUser(const std::string& email, const std::string& password) +UserState Session::loadUser(const std::string& email, const std::string& password) { static const char* functionName = "Session::loadUser"; auto observer = SingletonTaskObserver::getInstance(); @@ -742,24 +537,20 @@ UserStates Session::loadUser(const std::string& email, const std::string& passwo } //Profiler usedTime; lock(functionName); - if (mSessionUser && mSessionUser->getEmail() != email) { - mSessionUser.assign(nullptr); - mNewUser.assign(nullptr); - } + //if (!mSessionUser) { if (mNewUser.isNull()) { mNewUser = controller::User::create(); // load user for email only once from db mNewUser->load(email); - mSessionUser = new User(mNewUser); - //mSessionUser = new User(email.data()); + } auto user_model = mNewUser->getModel(); if (user_model && user_model->isDisabled()) { return USER_DISABLED; } - if (mSessionUser->getUserState() >= USER_LOADED_FROM_DB) { + if (mNewUser->getUserState() >= USER_LOADED_FROM_DB) { int loginResult = mNewUser->login(password); if (-1 == loginResult) { @@ -798,42 +589,30 @@ UserStates Session::loadUser(const std::string& email, const std::string& passwo } } } - // can be removed if session user isn't used any more - // don't calculate password two times anymore - mSessionUser->login(mNewUser); - /*if (mNewUser->getModel()->getPasswordHashed() && !mSessionUser->validatePwd(password, this)) { - unlock(); - return USER_PASSWORD_INCORRECT; - }*/ + } else { - User::fakeCreateCryptoKey(); + Poco::Thread::sleep(ServerConfig::g_FakeLoginSleepTime); } - /*if (!mSessionUser->validatePwd(password, this)) { - addError(new Error("Login", "E-Mail oder Passwort nicht korrekt, bitte versuche es erneut!")); - unlock(); - return false; - } - if (!mSessionUser->isEmailChecked()) { - addError(new Error("Account", "E-Mail Adresse wurde noch nicht bestätigt, hast du schon eine E-Mail erhalten?")); - unlock(); - return false; - }*/ detectSessionState(); unlock(); + if (0 == mNewUser->getModel()->getGroupId()) { + return USER_NO_GROUP; + } - return mSessionUser->getUserState(); + return mNewUser->getUserState(); } bool Session::deleteUser() { lock("Session::deleteUser"); bool bResult = false; - if(mSessionUser) { + if(!mNewUser.isNull()) { JsonRequest phpServerRequest(ServerConfig::g_php_serverHost, 443); Poco::Net::NameValueCollection payload; - payload.add("user", std::string(mSessionUser->getPublicKeyHex())); + auto user_model = mNewUser->getModel(); + payload.add("user", user_model->getPublicKeyHex()); //auto ret = phpServerRequest.request("userDelete", payload); JsonRequestReturn ret = JSON_REQUEST_RETURN_OK; if (ret == JSON_REQUEST_RETURN_ERROR) { @@ -842,7 +621,7 @@ bool Session::deleteUser() sendErrorsAsEmail(); } else if (ret == JSON_REQUEST_RETURN_OK) { - bResult = mSessionUser->deleteFromDB(); + bResult = user_model->deleteFromDB(); } else { addError(new Error(gettext("Benutzer"), gettext("Konnte Community Server nicht erreichen. E-Mail an den Admin ist raus."))); @@ -895,14 +674,14 @@ SESSION_STATE_COUNT */ void Session::detectSessionState() { - if (!mSessionUser || !mSessionUser->hasCryptoKey()) { + if (mNewUser.isNull() || !mNewUser->getModel() || mNewUser->getPassword().isNull()) { return; } - UserStates userState = mSessionUser->getUserState(); + UserState userState = mNewUser->getUserState(); int checkEmail = -1, resetPasswd = -1; try { - auto emailVerificationCodeObjects = controller::EmailVerificationCode::load(mSessionUser->getDBId()); + auto emailVerificationCodeObjects = controller::EmailVerificationCode::load(mNewUser->getModel()->getID()); for (int i = 0; i < emailVerificationCodeObjects.size(); i++) { auto type = emailVerificationCodeObjects[i]->getModel()->getType(); @@ -940,7 +719,7 @@ void Session::detectSessionState() if (USER_NO_KEYS == userState) { - auto user_id = mSessionUser->getDBId(); + auto user_id = mNewUser->getModel()->getID(); auto userBackups = controller::UserBackup::load(user_id); // check passphrase, only possible while passphrase isn't crypted in db @@ -948,15 +727,20 @@ void Session::detectSessionState() // always trigger SESSION_STATE_PASSPHRASE_WRITTEN, else lost of data possible bool cryptedPassphrase = userBackups.size() > 0; for (auto it = userBackups.begin(); it != userBackups.end(); it++) { - KeyPair keys; auto passphrase = (*it)->getModel()->getPassphrase(); Mnemonic* wordSource = nullptr; - if (User::validatePassphrase(passphrase, &wordSource)) { - if (keys.generateFromPassphrase((*it)->getModel()->getPassphrase().data(), wordSource)) { - if (sodium_memcmp(mSessionUser->getPublicKey(), keys.getPublicKey(), ed25519_pubkey_SIZE) == 0) { - correctPassphraseFound = true; - break; - } + auto passphrase_obj = Passphrase::create(passphrase, wordSource); + if (!passphrase_obj.isNull() && passphrase_obj->checkIfValid()) { + auto key_pair = KeyPairEd25519::create(passphrase_obj); + if (key_pair && key_pair->isTheSame(mNewUser->getModel()->getPublicKey())) { + correctPassphraseFound = true; + //break; + } + if (key_pair) { + delete key_pair; + } + if (correctPassphraseFound) { + break; } } else { @@ -1038,8 +822,7 @@ bool Session::loadFromEmailVerificationCode(Poco::UInt64 emailVerificationCode) addError(new Error(gettext("E-Mail Verification"), gettext("Fehler beim laden des Benutzers."))); return false; } - mSessionUser = new User(mNewUser); - mSessionUser->setLanguage(getLanguage()); + // TODO: Maybe update language key by user, is session has another, or update only with options-menu auto verificationType = mEmailVerificationCodeObject->getModel()->getType(); if (verificationType == model::table::EMAIL_OPT_IN_RESET_PASSWORD) { @@ -1117,21 +900,7 @@ bool Session::useOrGeneratePassphrase(const std::string& passphase) } } */ -bool Session::generatePassphrase() -{ - if (mNewUser.isNull()) return false; - - auto lang = getLanguage(); - if (lang == LANG_EN) { - mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]); - } - else { - mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER]); - } - //mPassphrase = User::generateNewPassphrase(&ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER]); - updateState(SESSION_STATE_PASSPHRASE_GENERATED); - return true; -} + bool Session::generateKeys(bool savePrivkey, bool savePassphrase) { diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index 6557ef30e..8834b63fd 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -11,7 +11,6 @@ #define DR_LUA_WEB_MODULE_SESSION_SESSION_H #include "../lib/NotificationList.h" -#include "User.h" #include "../controller/User.h" #include "../lib/MultithreadContainer.h" @@ -73,29 +72,20 @@ public: inline Poco::AutoPtr getNewUser() { return mNewUser; } // ---------------- User functions ---------------------------- - // TODO: register state: written into db, mails sended, update state only if new state is higher as old state - // create User send e-mail activation link - bool createUser(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password); //! \brief new register function, without showing user pubkeys, using controller/user - bool createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password); + bool createUserDirect(const std::string& first_name, const std::string& last_name, const std::string& email, const std::string& password, int groupId); // adminRegister without passwort - bool adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email); + bool adminCreateUser(const std::string& first_name, const std::string& last_name, const std::string& email, int group_id); // TODO: check if email exist and if not, fake waiting on password hashing with profiled times of real password hashing - UserStates loadUser(const std::string& email, const std::string& password); + UserState loadUser(const std::string& email, const std::string& password); bool ifUserExist(const std::string& email); - - inline void setUser(Poco::AutoPtr user) { mSessionUser = user; } - bool deleteUser(); - Poco::AutoPtr getUser() { - return mSessionUser; - } // ------------------------- Email Verification Code functions ------------------------------- @@ -117,7 +107,7 @@ public: //! \return 1 = same //! \return -1 = error //! \return -2 = critical error - int comparePassphraseWithSavedKeys(const std::string& inputPassphrase, Mnemonic* wordSource); + int comparePassphraseWithSavedKeys(const std::string& inputPassphrase, const Mnemonic* wordSource); Poco::Net::HTTPCookie getLoginCookie(); @@ -132,14 +122,13 @@ public: inline void setPassphrase(const std::string& passphrase) { mPassphrase = passphrase; } inline const std::string& getOldPassphrase() { return mPassphrase; } - bool generatePassphrase(); + bool generateKeys(bool savePrivkey, bool savePassphrase); inline void setClientIp(Poco::Net::IPAddress ip) { mClientLoginIP = ip; } inline Poco::Net::IPAddress getClientIp() { return mClientLoginIP; } inline bool isIPValid(Poco::Net::IPAddress ip) { return mClientLoginIP == ip; } - bool isPwdValid(const std::string& pwd); void reset(); void updateState(SessionStates newState); @@ -198,7 +187,6 @@ protected: private: int mHandleId; - Poco::AutoPtr mSessionUser; Poco::AutoPtr mNewUser; std::string mPassphrase; Poco::AutoPtr mNewPassphrase; @@ -219,44 +207,6 @@ private: }; -class WriteEmailVerification : public UniLib::controller::CPUTask -{ -public: - WriteEmailVerification(Poco::AutoPtr user, Poco::AutoPtr emailVerificationCode, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount = 0) - : UniLib::controller::CPUTask(cpuScheduler, taskDependenceCount), mUser(user), mEmailVerificationCode(emailVerificationCode) { -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif - } - - virtual const char* getResourceType() const { return "WriteEmailVerification"; }; - virtual int run(); - -private: - Poco::AutoPtr mUser; - Poco::AutoPtr mEmailVerificationCode; - -}; - -class WritePassphraseIntoDB : public UniLib::controller::CPUTask -{ -public: - WritePassphraseIntoDB(int userId, const std::string& passphrase) - : mUserId(userId), mPassphrase(passphrase) { -#ifdef _UNI_LIB_DEBUG - setName(std::to_string(userId).data()); -#endif - } - - - virtual int run(); - virtual const char* getResourceType() const { return "WritePassphraseIntoDB"; }; - -protected: - int mUserId; - std::string mPassphrase; -}; - class SessionStateUpdateCommand : public UniLib::controller::Command { public: diff --git a/src/cpp/model/TransactionCreation.cpp b/src/cpp/model/TransactionCreation.cpp index 499aef61d..fd80660d8 100644 --- a/src/cpp/model/TransactionCreation.cpp +++ b/src/cpp/model/TransactionCreation.cpp @@ -3,17 +3,14 @@ #include TransactionCreation::TransactionCreation(const std::string& memo, const proto::gradido::GradidoCreation& protoCreation) - : TransactionBase(memo), mProtoCreation(protoCreation), mReceiverUser(nullptr) + : TransactionBase(memo), mProtoCreation(protoCreation) { memset(mReceiverPublicHex, 0, 65); } TransactionCreation::~TransactionCreation() { - if (mReceiverUser) { - delete mReceiverUser; - mReceiverUser = nullptr; - } + } int TransactionCreation::prepare() @@ -30,15 +27,17 @@ int TransactionCreation::prepare() addError(new Error(functionName, "receiver public invalid (size not 32)")); return -2; } - mReceiverUser = new User((const unsigned char*)receiverPublic.data()); - getErrors(mReceiverUser); + mReceiverUser = controller::User::create(); + //mReceiverUser = new User((const unsigned char*)receiverPublic.data()); + mReceiverUser->load((const unsigned char*)receiverPublic.data()); + getErrors(mReceiverUser->getModel()); if (mReceiverUser->getUserState() == USER_EMPTY) { sodium_bin2hex(mReceiverPublicHex, 65, (const unsigned char*)receiverPublic.data(), receiverPublic.size()); delete mReceiverUser; mReceiverUser = nullptr; } else { - memcpy(mReceiverPublicHex, mReceiverUser->getPublicKeyHex().data(), 64); + memcpy(mReceiverPublicHex, mReceiverUser->getModel()->getPublicKeyHex().data(), 64); // uncomment because not correctly working /*if (!mReceiverUser->validateIdentHash(mProtoCreation.ident_hash())) { addError(new Error(functionName, "ident hash isn't the same")); diff --git a/src/cpp/model/TransactionCreation.h b/src/cpp/model/TransactionCreation.h index ff1fd62a8..fe695b89b 100644 --- a/src/cpp/model/TransactionCreation.h +++ b/src/cpp/model/TransactionCreation.h @@ -13,7 +13,7 @@ #include "TransactionBase.h" #include "../proto/gradido/GradidoCreation.pb.h" -#include "User.h" +#include "../controller/User.h" class TransactionCreation : public TransactionBase { @@ -23,7 +23,7 @@ public: int prepare(); - inline User* getUser() { return mReceiverUser; } + inline Poco::AutoPtr getUser() { return mReceiverUser; } inline google::protobuf::int64 getAmount() { return mProtoCreation.receiver().amount(); } inline char* getPublicHex() { return mReceiverPublicHex; } @@ -33,7 +33,7 @@ public: protected: const proto::gradido::GradidoCreation& mProtoCreation; char mReceiverPublicHex[65]; - User* mReceiverUser; + Poco::AutoPtr mReceiverUser; }; #endif //GRADIDO_LOGIN_SERVER_MODEL_TRANSACTION_CREATION_INCLUDE \ No newline at end of file diff --git a/src/cpp/model/User.cpp b/src/cpp/model/User.cpp deleted file mode 100644 index a57324cf8..000000000 --- a/src/cpp/model/User.cpp +++ /dev/null @@ -1,1323 +0,0 @@ -#include "User.h" -#include "Session.h" -#include -#include "ed25519/ed25519.h" -#include "Poco/Util/Application.h" -#include "Poco/RegularExpression.h" -#include "../ServerConfig.h" - -#include "../SingletonManager/ConnectionManager.h" -#include "../SingletonManager/ErrorManager.h" -#include "../SingletonManager/SessionManager.h" -#include "../SingletonManager/LanguageManager.h" -#include "../SingletonManager/SingletonTaskObserver.h" - -#include "../controller/UserBackup.h" - - -#include "Poco/Data/Binding.h" - -using namespace Poco::Data::Keywords; - -//#define DEBUG_USER_DELETE_ENV - - -// ------------------------------------------------------------------------------------------------- - -UserCreateCryptoKey::UserCreateCryptoKey(Poco::AutoPtr user, Poco::AutoPtr newUser, const std::string& password, UniLib::controller::CPUSheduler* cpuScheduler) - : UniLib::controller::CPUTask(cpuScheduler), mUser(user), mNewUser(newUser), mPassword(password) { -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif - -} - -int UserCreateCryptoKey::run() -{ - auto cryptoKey = mUser->createCryptoKey(mPassword); - mUser->setCryptoKey(cryptoKey); - - if (sizeof(User::passwordHashed) != crypto_shorthash_BYTES) { - printf("[UserCreateCryptoKey] crypto_shorthash_BYTES != sizeof(mPasswordHashed)\n"); - throw Poco::Exception("crypto_shorthash_BYTES != sizeof(mPasswordHashed)"); - } - - auto pwdHashed = mUser->createPasswordHashed(cryptoKey); - mUser->setPwdHashed(pwdHashed); - mNewUser->getModel()->setPasswordHashed(pwdHashed); - - //printf("crypto key created\n"); - setTaskFinished(); - // must poke cpu scheduler manually because another task is waiting for this task, but in the other scheduler - ServerConfig::g_CPUScheduler->checkPendingTasks(); - return 0; -} - -// ------------------------------------------------------------------------------------------------------------- - -int UserGenerateKeys::run() -{ - - Mnemonic* wordList = nullptr; - if (!User::validatePassphrase(mPassphrase, &wordList)) { - mUser->addError(new Error(mUser->gettext("User generate Keys"), mUser->gettext("invalid passphrase, please notice the server admin coin@gradido.net"))); - return -2; - } - - // always return true, cannot fail (only if low on memory) - // !!! update: now can fail, if passphrase is invalid, for example if memory is corrupted - if (!mKeys.generateFromPassphrase(mPassphrase.data(), wordList)) { - mUser->addError(new Error(mUser->gettext("User generate Keys"), mUser->gettext("invalid passphrase2, please notice the server admin coin@gradido.net"))); - return -1; - } - - mUser->setPublicKeyHex(mKeys.getPubkeyHex()); - mUser->setPublicKey(mKeys.getPublicKey()); - - auto newUserModel = mNewUser->getModel(); - - newUserModel->setPublicKey(mKeys.getPublicKey()); - if (mUser->hasCryptoKey()) { - mUser->setPrivKey(mKeys.getPrivateKey()); - newUserModel->setPrivateKey(mUser->getPrivKey()); - } - - //printf("[UserGenerateKeys::run] controller::User: %d\n", (int)mNewUser.get()); - - return 0; -} - -// ----------------------------------------------------------------------------------------------------- - -int UserWriteIntoDB::run() -{ - auto cm = ConnectionManager::getInstance(); - auto em = ErrorManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - Poco::Data::Statement insert = mUser->insertIntoDB(session); - try { - if (1 != insert.execute()) { - mUser->addError(new Error("User::insertIntoDB", "error by inserting data tuple to db")); - return -1; - } - } catch (Poco::Exception& ex) { - em->addError(new ParamError("[UserWriteIntoDB]", "error writing into db", ex.displayText().data())); - em->sendErrorsAsEmail(); - return -3; - } - if (!mUser->loadEntryDBId(session)) { - return -2; - } - return 0; -} - -// -------------------------------------------------------------------------------------------------------- - -UserWriteKeysIntoDB::UserWriteKeysIntoDB(std::vector parents, Poco::AutoPtr user, bool savePrivKey) - : UniLib::controller::CPUTask(parents.size()), mUser(user), mSavePrivKey(savePrivKey) -{ -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif - if (parents.size() < 1 || strcmp(parents[0]->getResourceType(), "UserGenerateKeys") != 0) { - throw Poco::Exception("given TaskPtr isn't UserGenerateKeys"); - } - for (int i = 0; i < parents.size(); i++) { - setParentTaskPtrInArray(parents[i], i); - } - //setParentTaskPtrInArray(parents[0], 0); - -} - -int UserWriteKeysIntoDB::run() -{ - auto cm = ConnectionManager::getInstance(); - auto em = ErrorManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - auto keyPairs = getParent(0).cast()->getKeyPairs(); - auto pubKey = keyPairs->getPublicKey(); - static const char* functionName = "UserWritePrivKeyIntoDB::run"; - - //printf("[UserWriteKeysIntoDB] after init\n"); - - Poco::Data::BLOB pubkey_blob(pubKey, crypto_sign_PUBLICKEYBYTES); - Poco::Data::Statement update(session); - Poco::Data::BLOB* pprivkey_blob = nullptr; - if (mSavePrivKey) { - //printf("[UserWriteKeysIntoDB] save privkey\n"); - // TODO: encrypt privkey - auto privKey = keyPairs->getPrivateKey(); - //printf("[UserWriteKeysIntoDB] privKey hex: %s\n", KeyPair::getHex(*privKey, privKey->size()).data()); - auto encryptedPrivKey = mUser->encrypt(privKey); - //pprivkey_blob = mUser->encrypt(privKey); - if (!encryptedPrivKey) { - em->addError(new Error(functionName, "no privkey found")); - em->sendErrorsAsEmail(); - return -1; - } - pprivkey_blob = new Poco::Data::BLOB(*encryptedPrivKey, encryptedPrivKey->size()); - //printf("[UserWriteKeysIntoDB] privkey encrypted\n"); - //Poco::Data::BLOB privkey_blob(*privKey, privKey->size()); - - update << "UPDATE users SET pubkey=?, privkey=? where id=?", - use(pubkey_blob), use(*pprivkey_blob), bind(mUser->getDBId()); - } - else { - update << "UPDATE users SET pubkey=? where id=?", - use(pubkey_blob), bind(mUser->getDBId()); - } - - try { - if (update.execute() != 1) { - em->addError(new ParamError(functionName, "error writing keys into db for user", std::to_string(mUser->getDBId()))); - em->sendErrorsAsEmail(); - if (pprivkey_blob) { - delete pprivkey_blob; - } - return -1; - } - } - catch (Poco::Exception& ex) { - em->addError(new ParamError(functionName, "mysql error updating", ex.displayText().data())); - em->sendErrorsAsEmail(); - if (pprivkey_blob) { - delete pprivkey_blob; - } - return -1; - } - - //printf("[UserWriteKeysIntoDB] after saving into db\n"); - if (pprivkey_blob) { - delete pprivkey_blob; - } - - return 0; -} - -// -------------------------------------------------------------------------------------------------------- - -UserWriteCryptoKeyHashIntoDB::UserWriteCryptoKeyHashIntoDB(Poco::AutoPtr user, int dependencieCount/* = 0*/) - : UniLib::controller::CPUTask(ServerConfig::g_CPUScheduler, dependencieCount), mUser(user) -{ -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif -} - -int UserWriteCryptoKeyHashIntoDB::run() -{ - mUser->updateIntoDB(USER_FIELDS_PASSWORD); - return 0; -} - -// ******************************************************************************* -// new user -User::User(const char* email, const char* first_name, const char* last_name) - : mState(USER_EMPTY), mDBId(0), mEmail(email), mFirstName(first_name), mLastName(last_name), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), - mLanguage(LANG_DE), mGradidoCurrentBalance(0), mCryptoKey(nullptr), mReferenceCount(1) -{ - memset(mPublicKey, 0, crypto_sign_PUBLICKEYBYTES); - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(mLanguage); -} -// load from db -User::User(const char* email) - : mState(USER_EMPTY), mDBId(0), mEmail(email), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), - mLanguage(LANG_DE), mGradidoCurrentBalance(0), mCryptoKey(nullptr), mReferenceCount(1) -{ - //crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey); - //memset(mPasswordHashed, 0, crypto_shorthash_BYTES); - auto cm = ConnectionManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - - memset(mPublicKey, 0, crypto_sign_PUBLICKEYBYTES); - - Poco::Nullable pubkey; - Poco::Nullable privkey; - - Poco::Data::Statement select(session); - int email_checked = 0; - std::string language_key; - select << "SELECT id, first_name, last_name, password, pubkey, privkey, email_checked, language from users where email = ?", - into(mDBId), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), into(language_key), - use(mEmail); - try { - auto result = select.execute(); - if (result == 1) { - mState = USER_LOADED_FROM_DB; - mLanguage = LanguageManager::languageFromString(language_key); - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(mLanguage); - - if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED;} - else if (pubkey.isNull()) { mState = USER_NO_KEYS;} - else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; } - else { mState = USER_COMPLETE;} - - mEmailChecked = email_checked == 1; - - if (!pubkey.isNull()) { - auto pubkey_value = pubkey.value(); - if (pubkey_value.size() == crypto_sign_PUBLICKEYBYTES) { - memcpy(mPublicKey, pubkey_value.content().data(), crypto_sign_PUBLICKEYBYTES); - } - else { - addError(new Error("User", "pubkey from db has other size as expected")); - } - size_t hexSize = pubkey_value.size() * 2 + 1; - char* hexString = (char*)malloc(hexSize); - memset(hexString, 0, hexSize); - sodium_bin2hex(hexString, hexSize, pubkey_value.content().data(), pubkey_value.size()); - mPublicHex = hexString; - free(hexString); - } - if (!privkey.isNull()) { - auto privkey_value = privkey.value(); - auto privkey_size = privkey_value.size(); - //mPrivateKey = new ObfusArray(privkey_value.size(), privkey_value.content().data()); - mPrivateKey = MemoryManager::getInstance()->getFreeMemory(privkey_size); - memcpy(*mPrivateKey, privkey_value.content().data(), privkey_size); - } - - } - } catch(Poco::Exception& ex) { - addError(new ParamError("User::User", "mysql error", ex.displayText().data())); - } -} - -User::User(int user_id) - : mState(USER_EMPTY), mDBId(user_id), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), - mLanguage(LANG_DE), mGradidoCurrentBalance(0), mCryptoKey(nullptr), mReferenceCount(1) -{ - auto cm = ConnectionManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - - memset(mPublicKey, 0, crypto_sign_PUBLICKEYBYTES); - - Poco::Nullable pubkey; - Poco::Nullable privkey; - - Poco::Data::Statement select(session); - int email_checked = 0; - std::string language_key; - select << "SELECT email, first_name, last_name, password, pubkey, privkey, email_checked, language from users where id = ?", - into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(pubkey), into(privkey), into(email_checked), into(language_key), - use(user_id); - try { - auto result = select.execute(); - if (result == 1) { - mState = USER_LOADED_FROM_DB; - mLanguage = LanguageManager::languageFromString(language_key); - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(mLanguage); - - if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED; } - else if (pubkey.isNull()) { mState = USER_NO_KEYS; } - else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; } - else { mState = USER_COMPLETE; } - - mEmailChecked = email_checked == 1; - - if (!pubkey.isNull()) { - auto pubkey_value = pubkey.value(); - if (pubkey_value.size() == crypto_sign_PUBLICKEYBYTES) { - memcpy(mPublicKey, pubkey_value.content().data(), crypto_sign_PUBLICKEYBYTES); - } - else { - addError(new Error("User", "pubkey from db has other size as expected")); - } - size_t hexSize = pubkey_value.size() * 2 + 1; - char* hexString = (char*)malloc(hexSize); - memset(hexString, 0, hexSize); - sodium_bin2hex(hexString, hexSize, pubkey_value.content().data(), pubkey_value.size()); - mPublicHex = hexString; - free(hexString); - } - if (!privkey.isNull()) { - auto privkey_value = privkey.value(); - auto privkey_size = privkey_value.size(); - //mPrivateKey = new ObfusArray(privkey_value.size(), privkey_value.content().data()); - mPrivateKey = MemoryManager::getInstance()->getFreeMemory(privkey_size); - memcpy(*mPrivateKey, privkey_value.content().data(), privkey_size); - } - } - } - catch (Poco::Exception& ex) { - addError(new ParamError("User::User", "mysql error", ex.displayText().data())); - } -} - -User::User(const unsigned char* pubkey_array) - : mState(USER_EMPTY), mDBId(0), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), - mLanguage(LANG_DE), mGradidoCurrentBalance(0), mCryptoKey(nullptr), mReferenceCount(1) -{ - //crypto_shorthash(mPasswordHashed, (const unsigned char*)password, strlen(password), *ServerConfig::g_ServerCryptoKey); - //memset(mPasswordHashed, 0, crypto_shorthash_BYTES); - auto cm = ConnectionManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - - memcpy(mPublicKey, pubkey_array, crypto_sign_PUBLICKEYBYTES); - - Poco::Data::BLOB pubkey(pubkey_array, 32); - Poco::Nullable privkey; - - Poco::Data::Statement select(session); - int email_checked = 0; - std::string language_key; - select << "SELECT id, email, first_name, last_name, password, privkey, email_checked, language from users where pubkey = ?", - into(mDBId), into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(privkey), into(email_checked), into(language_key), - use(pubkey); - try { - auto result = select.execute(); - if (result == 1) { - mState = USER_LOADED_FROM_DB; - mLanguage = LanguageManager::languageFromString(language_key); - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(mLanguage); - - if (email_checked == 0) { mState = USER_EMAIL_NOT_ACTIVATED; } - else if (privkey.isNull()) { mState = USER_NO_PRIVATE_KEY; } - else { mState = USER_COMPLETE; } - - mEmailChecked = email_checked == 1; - - size_t hexSize = pubkey.size() * 2 + 1; - char* hexString = (char*)malloc(hexSize); - memset(hexString, 0, hexSize); - sodium_bin2hex(hexString, hexSize, pubkey.content().data(), pubkey.size()); - mPublicHex = hexString; - free(hexString); - - if (!privkey.isNull()) { - auto privkey_value = privkey.value(); - auto privkey_size = privkey_value.size(); - //mPrivateKey = new ObfusArray(privkey_value.size(), privkey_value.content().data()); - mPrivateKey = MemoryManager::getInstance()->getFreeMemory(privkey_size); - memcpy(*mPrivateKey, privkey_value.content().data(), privkey_size); - } - - } - - } - catch (Poco::Exception& ex) { - addError(new ParamError("User::User", "mysql error", ex.displayText().data())); - } -} - -User::User(Poco::AutoPtr ctrl_user) - : mUserCtrl(ctrl_user), mState(USER_EMPTY), mDBId(0), mPasswordHashed(0), mPrivateKey(nullptr), mEmailChecked(false), - mLanguage(LANG_DE), mGradidoCurrentBalance(0), mCryptoKey(nullptr), mReferenceCount(1) -{ - assert(!ctrl_user.isNull()); - auto model = ctrl_user->getModel(); - assert(model); - - auto mm = MemoryManager::getInstance(); - mDBId = model->getID(); - mEmail = model->getEmail(); - mFirstName = model->getFirstName(); - mLastName = model->getLastName(); - mPasswordHashed = model->getPasswordHashed(); - auto pubkey = model->getPublicKey(); - if (pubkey) { - memcpy(mPublicKey, pubkey, crypto_sign_PUBLICKEYBYTES); - - size_t hexSize = crypto_sign_PUBLICKEYBYTES * 2 + 1; - auto hexStringTemp = mm->getFreeMemory(hexSize); - //char* hexString = (char*)malloc(hexSize); - memset(*hexStringTemp, 0, hexSize); - sodium_bin2hex((char*)(*hexStringTemp), hexSize, pubkey, crypto_sign_PUBLICKEYBYTES); - mPublicHex = std::string((char*)(*hexStringTemp)); - mm->releaseMemory(hexStringTemp); - } - if (model->hasPrivateKeyEncrypted()) { - auto privKeyVetor = model->getPrivateKeyEncrypted(); - mPrivateKey = mm->getFreeMemory(privKeyVetor.size()); - memcpy(*mPrivateKey, privKeyVetor.data(), privKeyVetor.size()); - } - mEmailChecked = model->isEmailChecked(); - mLanguage = LanguageManager::languageFromString(model->getLanguageKey()); - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(mLanguage); - - /* - USER_EMPTY, - USER_LOADED_FROM_DB, - USER_PASSWORD_INCORRECT, - USER_PASSWORD_ENCRYPTION_IN_PROCESS, - USER_EMAIL_NOT_ACTIVATED, - USER_NO_KEYS, - USER_NO_PRIVATE_KEY, - USER_COMPLETE - */ - - if (mEmail != "") { - mState = USER_LOADED_FROM_DB; - - if (!mEmailChecked) { mState = USER_EMAIL_NOT_ACTIVATED; } - else if (!pubkey) { mState = USER_NO_KEYS; } - else if (!mPrivateKey) { mState = USER_NO_PRIVATE_KEY; } - else { mState = USER_COMPLETE; } - } -} - - -User::~User() -{ -#ifdef DEBUG_USER_DELETE_ENV - printf("[User::~User]\n"); -#endif - auto mm = MemoryManager::getInstance(); - if (mCryptoKey) { - //delete mCryptoKey; - mm->releaseMemory(mCryptoKey); - mCryptoKey = nullptr; - } - if (mPrivateKey) { - //delete mPrivateKey; - mm->releaseMemory(mPrivateKey); - mPrivateKey = nullptr; - } -} - -void User::setLanguage(Languages lang) -{ - lock("User::setLanguage"); - if (mLanguage != lang) { - mLanguageCatalog = LanguageManager::getInstance()->getFreeCatalog(lang); - } - mLanguage = lang; - unlock(); -} - - -std::string User::generateNewPassphrase(Mnemonic* word_source) -{ - auto em = ErrorManager::getInstance(); - static const char* errorMessageForUser = "Ein Fehler, bitte wende dich an den Server-Admin (coin@gradido.net). | An error occured, please ask the server admin (coin@gradido.net)."; - unsigned int random_indices[PHRASE_WORD_COUNT]; - unsigned int str_sizes[PHRASE_WORD_COUNT]; - unsigned int phrase_buffer_size = 0; - bool errorReloadingMnemonicWordList = false; - int loopTrys = 0; - Poco::RegularExpression checkValidWord("^[a-zA-ZÄÖÜäöüß&;]*$"); - - // TODO: make sure words didn't double - for (int i = 0; i < PHRASE_WORD_COUNT; i++) { - random_indices[i] = randombytes_random() % 2048; - auto word = word_source->getWord(random_indices[i]); - if (loopTrys > 10 || errorReloadingMnemonicWordList) { - return errorMessageForUser; - } - if (!word) { - em->addError(new ParamError("User::generateNewPassphrase", "empty word get for index", random_indices[i])); - em->sendErrorsAsEmail(); - - random_indices[i] = randombytes_random() % 2048; - word = word_source->getWord(random_indices[i]); - if (!word) return errorMessageForUser; - - } - else { - if (!checkValidWord.match(word, 0, Poco::RegularExpression::RE_NOTEMPTY)) { - em->addError(new ParamError("User::generateNewPassphrase", "invalid word", word)); - em->addError(new Error("User::generateNewPassphrase", "try to reload mnemonic word list, but this error is maybe evidence for a serious memory problem!!!")); - if (!ServerConfig::loadMnemonicWordLists()) { - em->addError(new Error("User::generateNewPassphrase", "error reloading mnemonic word lists")); - errorReloadingMnemonicWordList = true; - } - else { - i = 0; - loopTrys++; - } - em->sendErrorsAsEmail(); - //return "Server Fehler, bitte frage den Admin coin@gradido.net | Server error, please ask the admin coin@gradido.net"; - } - } - str_sizes[i] = strlen(word); - phrase_buffer_size += str_sizes[i]; - } - phrase_buffer_size += PHRASE_WORD_COUNT + 1; - - std::string phrase_buffer(phrase_buffer_size, '\0'); - int phrase_buffer_cursor = 0; - - for (int i = 0; i < PHRASE_WORD_COUNT; i++) { - memcpy(&phrase_buffer[phrase_buffer_cursor], word_source->getWord(random_indices[i]), str_sizes[i]); - - phrase_buffer_cursor += str_sizes[i]; - phrase_buffer[phrase_buffer_cursor++] = ' '; - } - - - return phrase_buffer; -} - -bool User::validatePassphrase(const std::string& passphrase, Mnemonic** wordSource/* = nullptr*/) -{ - return KeyPair::validatePassphrase(passphrase, wordSource); - -} - -bool User::isEmptyPassword() -{ - bool bRet = false; - lock("User::isEmptyPassword"); - //printf("[User::isEmptyPassword] pwd hashed: %d, running: %d, this: %d\n", -// mPasswordHashed, !mCreateCryptoKeyTask.isNull(), this); - bRet = mPasswordHashed == 0 && (mCreateCryptoKeyTask.isNull() || mCreateCryptoKeyTask->isTaskFinished()); - unlock(); - return bRet; -} - -UserStates User::getUserState() -{ - UserStates state; - lock("User::getUserState"); - state = mState; - unlock(); - return state; -} - -Poco::JSON::Object User::getJson() -{ - lock("User::getJson"); - Poco::JSON::Object userObj; - - userObj.set("first_name", mFirstName); - userObj.set("last_name", mLastName); - userObj.set("email", mEmail); - userObj.set("public_hex", mPublicHex); - userObj.set("state", userStateToString(mState)); - userObj.set("email_checked", mEmailChecked); - userObj.set("ident_hash", DRMakeStringHash(mEmail.data(), mEmail.size())); - unlock(); - return userObj; -} - -/* -// TODO: if a password and privkey already exist, load current private key and re encrypt with new crypto key -bool User::setNewPassword(const std::string& newPassword) -{ - //Profiler timeUsed; - if (newPassword == "") { - lock("User::setNewPassword"); - addError(new Error("Passwort", "Ist leer.")); - unlock(); - return false; - } - if (!mCreateCryptoKeyTask.isNull() && !mCreateCryptoKeyTask->isTaskFinished()) { - lock("User::setNewPassword"); - addError(new Error("Passwort", "Wird bereits erstellt, bitte in ca. 1 minute neuladen.")); - unlock(); - return false; - } - duplicate(); - lock("User::setNewPassword"); - //printf("[User::setNewPassword] start create crypto key task with this: %d\n", this); - mCreateCryptoKeyTask = new UserCreateCryptoKey(this, newPassword, ServerConfig::g_CPUScheduler); - mCreateCryptoKeyTask->scheduleTask(mCreateCryptoKeyTask); - unlock(); - - duplicate(); - - UniLib::controller::TaskPtr savePassword(new UserWriteCryptoKeyHashIntoDB(this, 1)); - savePassword->setParentTaskPtrInArray(mCreateCryptoKeyTask, 0); - savePassword->scheduleTask(savePassword); - - - //printf("[User::setNewPassword] timeUsed: %s\n", timeUsed.string().data()); - return true; -} -*/ -bool User::updatePassword(const std::string& newPassword, const std::string& passphrase, Poco::AutoPtr newUser) -{ - static const char* functionName("User::updatePassword"); - if (newPassword == "") { - lock(functionName); - addError(new Error(gettext("Passwort"), gettext("Ist leer."))); - unlock(); - return false; - } - if (!mCreateCryptoKeyTask.isNull() && !mCreateCryptoKeyTask->isTaskFinished()) { - lock(functionName); - addError(new Error(gettext("Passwort"), gettext("Wird bereits erstellt, bitte in ca. 1 minute neuladen."))); - unlock(); - return false; - } - //duplicate(); - //lock("User::setNewPassword"); - //printf("[User::setNewPassword] start create crypto key task with this: %d\n", this); - //mCreateCryptoKeyTask = new UserCreateCryptoKey(this, newPassword, ServerConfig::g_CPUScheduler); - //mCreateCryptoKeyTask->scheduleTask(mCreateCryptoKeyTask); - //unlock(); - - auto mm = MemoryManager::getInstance(); - - bool passwordHashedCalculated = false; - - // no previous password set - - //if (!mPasswordHashed) { - duplicate(); - lock(functionName); - //printf("[User::setNewPassword] start create crypto key task with this: %d\n", this); - mCreateCryptoKeyTask = new UserCreateCryptoKey(this, newUser, newPassword, ServerConfig::g_CPUScheduler); - mCreateCryptoKeyTask->scheduleTask(mCreateCryptoKeyTask); - unlock(); - //} - /*else { - // compare with previous password - auto cryptoKey = createCryptoKey(newPassword); - auto passwordHash = createPasswordHashed(cryptoKey); - lock(functionName); - if (mPasswordHashed == passwordHash) { - addError(new Error(gettext("Passwort"), gettext("Du hast dasselbe Passwort gewählt, bitte wähle ein anderes."))); - unlock(); - mm->releaseMemory(cryptoKey); - return false; - } - mPasswordHashed = passwordHash; - passwordHashedCalculated = true; - if (mCryptoKey) { - mm->releaseMemory(mCryptoKey); - } - mCryptoKey = cryptoKey; - unlock(); - }*/ - - duplicate(); - UniLib::controller::TaskPtr savePassword(nullptr); - UserWriteCryptoKeyHashIntoDB* writePWDHashedIntoDB = nullptr; - if (passwordHashedCalculated) { - savePassword = new UserWriteCryptoKeyHashIntoDB(this, 0); - } - else { - savePassword = new UserWriteCryptoKeyHashIntoDB(this, 1); - savePassword->setParentTaskPtrInArray(mCreateCryptoKeyTask, 0); - } - savePassword->scheduleTask(savePassword); - - if (passphrase != "") { - duplicate(); - UniLib::controller::TaskPtr genKeys(new UserGenerateKeys(this, newUser, passphrase)); - genKeys->scheduleTask(genKeys); - - - std::vector saveKeysParents; - saveKeysParents.reserve(2); // to prevent allocating more memory as ever needed - saveKeysParents.push_back(genKeys); - if (!passwordHashedCalculated) { - saveKeysParents.push_back(mCreateCryptoKeyTask); - } - duplicate(); - UniLib::controller::TaskPtr saveKeys(new UserWriteKeysIntoDB(saveKeysParents, this, true)); - saveKeys->scheduleTask(saveKeys); - } - - //printf("[User::setNewPassword] timeUsed: %s\n", timeUsed.string().data()); - return true; -} - -void User::setEmailChecked() -{ - lock("User::setEmailChecked"); - mEmailChecked = true; - if (mState <= USER_EMAIL_NOT_ACTIVATED) { - if (mPublicHex == "") { - mState = USER_NO_KEYS; - } - else if (!mPrivateKey) { - mState = USER_NO_PRIVATE_KEY; - } - else { - mState = USER_COMPLETE; - } - } - unlock(); -} - -bool User::validatePwd(const std::string& pwd, NotificationList* validationErrorsToPrint) -{ - auto mm = MemoryManager::getInstance(); - auto cmpCryptoKey = createCryptoKey(pwd); - if (sizeof(User::passwordHashed) != crypto_shorthash_BYTES) { - throw Poco::Exception("crypto_shorthash_BYTES != sizeof(User::passwordHashed)"); - } - if (nullptr == cmpCryptoKey) { - if (validationErrorsToPrint) { - validationErrorsToPrint->addError(new Error("User::validatePwd", "couldn't create crypto key")); - return false; - } - } - User::passwordHashed pwdHashed; - if (!ServerConfig::g_ServerCryptoKey) { - if (validationErrorsToPrint) { - validationErrorsToPrint->addError(new Error("User::validatePwd", "server crypto key not set")); - } - mm->releaseMemory(cmpCryptoKey); - return false; - } - crypto_shorthash((unsigned char*)&pwdHashed, *cmpCryptoKey, crypto_box_SEEDBYTES, *ServerConfig::g_ServerCryptoKey); - lock("User::validatePwd"); - if (pwdHashed == mPasswordHashed) { - if (!mCryptoKey) { - mCryptoKey = cmpCryptoKey; - } - else { - //delete cmpCryptoKey; - mm->releaseMemory(cmpCryptoKey); - } - unlock(); - return true; - } - //delete cmpCryptoKey; - mm->releaseMemory(cmpCryptoKey); - - unlock(); - return false; -} - -void User::login(Poco::AutoPtr newUser) -{ - assert(!newUser.isNull()); - assert(newUser->getModel()); - - lock("User::validatePwd"); - mPasswordHashed = newUser->getModel()->getPasswordHashed(); - auto mm = MemoryManager::getInstance(); - if (mCryptoKey) { - mm->releaseMemory(mCryptoKey); - mCryptoKey = nullptr; - } - auto keyPair = newUser->getGradidoKeyPair(); - if (keyPair) { - mCryptoKey = keyPair->getCryptedPrivKey(newUser->getPassword()); - } - unlock(); -} - -bool User::validateIdentHash(HASH hash) -{ - lock("User::validateIdentHash"); - HASH local_hash = DRMakeStringHash(mEmail.data(), mEmail.size()); - unlock(); - return local_hash == hash; -} - -bool User::deleteFromDB() -{ - auto cm = ConnectionManager::getInstance(); - auto em = ErrorManager::getInstance(); - auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - - Poco::Data::Statement deleteFromDB(session); - //DELETE FROM `table_name` [WHERE condition]; - - std::string tables[] = { "users", "email_opt_in", "user_backups" }; - - /*deleteFromDB - << "DELETE from users where id = ?;" - "DELETE from email_opt_in where user_id = ?;" - "DELETE from user_backups where user_id = ?", - use(mDBId), use(mDBId), use(mDBId); - */ - for (int i = 0; i < 3; i++) { - if (i > 0) { - deleteFromDB.reset(session); - deleteFromDB << "DELETE from " << tables[i] << " where user_id = ?", use(mDBId); - } - else { - deleteFromDB << "DELETE from " << tables[i] << " where id = ?", use(mDBId); - } - - try { - lock("User::deleteFromDB"); - auto result = deleteFromDB.execute(); - unlock(); - //printf("[User::deleteFromDB] %s deleted: %d\n", tables[i].data(), result); - } - catch (Poco::Exception& ex) { - unlock(); - em->addError(new ParamError("[User::deleteFromDB]", "error deleting user tables", ex.displayText().data())); - em->sendErrorsAsEmail(); - //return false; - } - } - - - return true; -} - -void User::duplicate() -{ - Poco::Mutex::ScopedLock _lock(mReferenceMutex); - //mReferenceMutex.lock(); - mReferenceCount++; -#ifdef DEBUG_USER_DELETE_ENV - printf("[User::duplicate] new value: %d\n", mReferenceCount); -#endif - //mReferenceMutex.unlock(); -} - -void User::release() -{ - - Poco::Mutex::ScopedLock _lock(mReferenceMutex); - //mReferenceMutex.lock(); - mReferenceCount--; -#ifdef DEBUG_USER_DELETE_ENV - printf("[User::release] new value: %d, this: %d\n", mReferenceCount, this); -#endif - if (0 == mReferenceCount) { - //mReferenceMutex.unlock(); - delete this; - return; - } - //mReferenceMutex.unlock(); - -} - -MemoryBin* User::createCryptoKey(const std::string& password) -{ - - //Profiler timeUsed; - auto mm = MemoryManager::getInstance(); - auto observer = SingletonTaskObserver::getInstance(); - static const char* funcName = "User::createCryptoKey"; - if (mEmail == "") { - lock(funcName); - addError(new Error(funcName, "email is empty")); - unlock(); - return nullptr; - } - - - - // TODO: put it in secure location, or use value from server config - static const unsigned char app_secret[] = { 0x21, 0xff, 0xbb, 0xc6, 0x16, 0xfe }; - - sha_context context_sha512; - //unsigned char* hash512 = (unsigned char*)malloc(SHA_512_SIZE); - if (SHA_512_SIZE < crypto_pwhash_SALTBYTES) { - lock(funcName); - addError(new Error(funcName, "sha512 is to small for libsodium pwhash saltbytes")); - unlock(); - return nullptr; - } - - observer->addTask(mEmail, TASK_OBSERVER_PASSWORD_CREATION); - - unsigned char hash512_salt[SHA_512_SIZE]; // need at least crypto_pwhash_SALTBYTES 16U - sha512_init(&context_sha512); - sha512_update(&context_sha512, (const unsigned char*)mEmail.data(), mEmail.size()); - sha512_update(&context_sha512, app_secret, 6); - sha512_final(&context_sha512, hash512_salt); - - - //unsigned char* key = (unsigned char *)malloc(crypto_box_SEEDBYTES); // 32U - //ObfusArray* key = new ObfusArray(crypto_box_SEEDBYTES); - auto key = mm->getFreeMemory(crypto_box_SEEDBYTES); - //Bin32Bytes* key = mm->get32Bytes(); - if (crypto_pwhash(*key, key->size(), password.data(), password.size(), hash512_salt, 10U, 33554432, 2) != 0) { - lock(funcName); - addError(new ParamError(funcName, " error creating pwd hash, maybe to much memory requestet? error:", strerror(errno))); - unlock(); - observer->removeTask(mEmail, TASK_OBSERVER_PASSWORD_CREATION); - //printf("[User::%s] error creating pwd hash, maybe to much memory requestet? error: %s\n", __FUNCTION__, strerror(errno)); - //printf("pwd: %s\n", pwd); - return nullptr; - } - observer->removeTask(mEmail, TASK_OBSERVER_PASSWORD_CREATION); - -// lock(); -// auto cryptoKey = new ObfusArray(crypto_box_SEEDBYTES, key); -// unlock(); -// free(key); - - // mCryptoKey - //printf("[User::createCryptoKey] time used: %s\n", timeUsed.string().data()); - return key; -} - -User::passwordHashed User::createPasswordHashed(MemoryBin* cryptoKey, NotificationList* errorReceiver/* = nullptr*/) -{ - if (sizeof(User::passwordHashed) != crypto_shorthash_BYTES) { - throw Poco::Exception("crypto_shorthash_BYTES != sizeof(User::passwordHashed)"); - } - User::passwordHashed pwdHashed = 0; - if (!ServerConfig::g_ServerCryptoKey) { - if (errorReceiver) { - errorReceiver->addError(new Error("User::validatePwd", "server crypto key not set")); - } - return pwdHashed; - } - crypto_shorthash((unsigned char*)&pwdHashed, *cryptoKey, crypto_box_SEEDBYTES, *ServerConfig::g_ServerCryptoKey); - - return pwdHashed; -} - -void User::fakeCreateCryptoKey() -{ - Poco::Thread::sleep(ServerConfig::g_FakeLoginSleepTime); -} - -bool User::generateKeys(bool savePrivkey, const std::string& passphrase, Session* session) -{ - //Profiler timeUsed; - - duplicate(); - UniLib::controller::TaskPtr generateKeysTask(new UserGenerateKeys(this, session->getNewUser(), passphrase)); - //generateKeysTask->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_KEY_PAIR_GENERATED, session)); - //generateKeysTask->scheduleTask(generateKeysTask); - // run directly because we like to show pubkey on interface, shouldn't last to long - generateKeysTask->run(); - session->updateState(SESSION_STATE_KEY_PAIR_GENERATED); - - if (mDBId == 0) { - //printf("[User::generateKeys] dbid is zero, load from db\n"); - loadEntryDBId(ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER)); - if (mDBId == 0) { - auto em = ErrorManager::getInstance(); - em->addError(new ParamError("User::generateKeys", "user not found in db with email", mEmail.data())); - em->sendErrorsAsEmail(); - } - return false; - } - - duplicate(); - std::vector parentsForWriteKeys; - parentsForWriteKeys.reserve(2); - parentsForWriteKeys.push_back(generateKeysTask); - if (!mCreateCryptoKeyTask.isNull() && !mCreateCryptoKeyTask->isTaskFinished()) { - parentsForWriteKeys.push_back(mCreateCryptoKeyTask); - } - - UniLib::controller::TaskPtr saveKeysTask(new UserWriteKeysIntoDB(parentsForWriteKeys, this, savePrivkey)); - saveKeysTask->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_KEY_PAIR_WRITTEN, session)); - saveKeysTask->scheduleTask(saveKeysTask); - - -// printf("[User::generateKeys] call two tasks, time used: %s\n", timeUsed.string().data()); - return true; - -} - -MemoryBin* User::encrypt(const MemoryBin* data) -{ - if (!hasCryptoKey()) { - addError(new Error("User::encrypt", "hasn't crypto key")); - return nullptr; - } - if (!data) { - addError(new Error("User::encrypt", "data is zero")); - return nullptr; - } - size_t message_len = data->size(); - size_t ciphertext_len = crypto_secretbox_MACBYTES + message_len; - - unsigned char nonce[crypto_secretbox_NONCEBYTES]; - // we use a hardcoded value for nonce - memset(nonce, 31, crypto_secretbox_NONCEBYTES); - - //unsigned char* ciphertext = (unsigned char*)malloc(ciphertext_len); - //ObfusArray* ciphertext = new ObfusArray(ciphertext_len); - auto mm = MemoryManager::getInstance(); - auto ciphertext = mm->getFreeMemory(ciphertext_len); - memset(*ciphertext, 0, ciphertext_len); - - if (0 != crypto_secretbox_easy(*ciphertext, *data, message_len, nonce, *mCryptoKey)) { - //printf("[%s] error encrypting message \n", __FUNCTION__); - addError(new Error("User::encrypt", "encrypting message failed")); - //free(ciphertext); - mm->releaseMemory(ciphertext); - - return nullptr; - } - - //printf("[User::encrypt] encrypted: %s, ciphertext len: %u\n", KeyPair::getHex(ciphertext, ciphertext_len).data(), ciphertext_len); - - //auto resultObfus = new ObfusArray(ciphertext_len, ciphertext); - //free(ciphertext); - - return ciphertext; -} - -MemoryBin* User::decrypt(const MemoryBin* encryptedData) -{ - if (!hasCryptoKey()) { - addError(new Error("User::decrypt", "hasn't crypto key")); - return nullptr; - } - //printf("[User::decrypt] decrypt: %s, ciphertext len: %u\n", KeyPair::getHex(*encryptedData, encryptedData->size()).data(), encryptedData->size()); - //ObfusArray* decrypetData = new ObfusArray(encryptedData->size() - crypto_secretbox_MACBYTES); - - size_t decryptSize = encryptedData->size() - crypto_secretbox_MACBYTES; - //unsigned char* decryptBuffer = (unsigned char*)malloc(decryptSize); - auto mm = MemoryManager::getInstance(); - //ObfusArray* decryptedData = new ObfusArray(decryptSize); - auto decryptedData = mm->getFreeMemory(decryptSize); - unsigned char nonce[crypto_secretbox_NONCEBYTES]; - // we use a hardcoded value for nonce - memset(nonce, 31, crypto_secretbox_NONCEBYTES); - - if (crypto_secretbox_open_easy(*decryptedData, *encryptedData, encryptedData->size(), nonce, *mCryptoKey)) { - mm->releaseMemory(decryptedData); - addError(new Error("User::decrypt", "error decrypting")); - return nullptr; - } - /*int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k);*/ - - return decryptedData; -} - -MemoryBin* User::sign(const unsigned char* message, size_t messageSize) -{ - - if (!message || !messageSize) return nullptr; - if (!hasCryptoKey()) { - addError(new Error("User::sign", "hasn't crypto key")); - return nullptr; - } - if (!mPrivateKey) { - addError(new Error("User::sign", "hasn't privkey")); - return nullptr; - } - - //binArrayObj = new BinaryArray(crypto_sign_BYTES); - auto mm = MemoryManager::getInstance(); - //auto signBinBuffer = (unsigned char*)malloc(crypto_sign_BYTES); - auto privKey = getPrivKey(); - - if (!privKey) { - //addError(new Error("User::sign", "decrypt privkey failed")); - - - auto userBackups = controller::UserBackup::load(mDBId); - - // get privkey, only possible while passphrase isn't crypted in db - bool correctPassphraseFound = false; - KeyPair keys; - for (auto it = userBackups.begin(); it != userBackups.end(); it++) { - - auto passphrase = (*it)->getModel()->getPassphrase(); - Mnemonic* wordSource = nullptr; - if (User::validatePassphrase(passphrase, &wordSource)) { - if (keys.generateFromPassphrase((*it)->getModel()->getPassphrase().data(), wordSource)) { - if(keys.isPubkeysTheSame(getPublicKey())) - { - correctPassphraseFound = true; - break; - } - } - } - } - if (correctPassphraseFound) { - - // save corrected key into db - auto encyrptedPrivKey = encrypt(keys.getPrivateKey()); - auto newUser = controller::User::create(); - if (1 == newUser->load(mDBId)) { - auto userModel = newUser->getModel(); - if (encyrptedPrivKey) { - userModel->setPrivateKey(encyrptedPrivKey); - userModel->updatePrivkey(); - // remove unencrypt error from priv key to prevent error 404 forwarding - delete getLastError(); - } - - mm->releaseMemory(encyrptedPrivKey); - - } - - // sign with received key - auto const_privKey = keys.getPrivateKey(); - auto signBinBuffer = mm->getFreeMemory(crypto_sign_BYTES); - unsigned long long actualSignLength = 0; - - if (crypto_sign_detached(*signBinBuffer, &actualSignLength, message, messageSize, *const_privKey)) { - addError(new Error("User::sign 2", "sign failed")); - mm->releaseMemory(signBinBuffer); - return nullptr; - } - - if (crypto_sign_verify_detached(*signBinBuffer, message, messageSize, mPublicKey) != 0) { - // Incorrect signature! - //printf("c[KeyBuffer::%s] sign verify failed\n", __FUNCTION__); - addError(new Error("User::sign 2", "sign verify failed")); - mm->releaseMemory(privKey); - mm->releaseMemory(signBinBuffer); - return nullptr; - } - - return signBinBuffer; - } - - return nullptr; - } - - auto signBinBuffer = mm->getFreeMemory(crypto_sign_BYTES); - - unsigned long long actualSignLength = 0; - - if (crypto_sign_detached(*signBinBuffer, &actualSignLength, message, messageSize, *privKey)) { - addError(new Error("User::sign", "sign failed")); - mm->releaseMemory(privKey); - mm->releaseMemory(signBinBuffer); - return nullptr; - } - - if (crypto_sign_verify_detached(*signBinBuffer, message, messageSize, mPublicKey) != 0) { - // Incorrect signature! - //printf("c[KeyBuffer::%s] sign verify failed\n", __FUNCTION__); - addError(new Error("User::sign", "sign verify failed")); - mm->releaseMemory(privKey); - mm->releaseMemory(signBinBuffer); - return nullptr; - } - - // debug - const size_t hex_sig_size = crypto_sign_BYTES * 2 + 1; - char sig_hex[hex_sig_size]; - sodium_bin2hex(sig_hex, hex_sig_size, *signBinBuffer, crypto_sign_BYTES); - printf("[User::sign] signature hex: %s\n", sig_hex); - - mm->releaseMemory(privKey); - - return signBinBuffer; -} - -Poco::Data::Statement User::insertIntoDB(Poco::Data::Session session) -{ - - Poco::Data::Statement insert(session); - - //Poco::Data::BLOB pwd(&mPasswordHashed[0], crypto_shorthash_BYTES); - - //printf("[User::insertIntoDB] password hashed: %llu\n", mPasswordHashed); - std::string languageKey = LanguageManager::keyForLanguage(mLanguage); - if (mPasswordHashed) { - insert << "INSERT INTO users (email, first_name, last_name, password, language) VALUES(?, ?, ?, ?, ?);", - use(mEmail), use(mFirstName), use(mLastName), bind(mPasswordHashed), bind(languageKey); - } - else { - insert << "INSERT INTO users (email, first_name, last_name, language) VALUES(?, ?, ?, ?);", - use(mEmail), use(mFirstName), use(mLastName), bind(languageKey); - } - - - return insert; -} - -bool User::updateIntoDB(UserFields fieldType) -{ - - if (mDBId == 0) { - addError(new Error("User::updateIntoDB", "user id is zero")); - return false; - } - if (USER_FIELDS_PASSWORD == fieldType || USER_FIELDS_EMAIL_CHECKED == fieldType) { - auto session = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); - Poco::Data::Statement update(session); - if (USER_FIELDS_PASSWORD == fieldType) { - update << "UPDATE users SET password = ? where id = ?", - use(mPasswordHashed), use(mDBId); - } - else if (USER_FIELDS_EMAIL_CHECKED == fieldType) { - update << "UPDATE users SET email_checked = ? where id = ?", - use(mEmailChecked), use(mDBId); - } - else if (USER_FIELDS_LANGUAGE == fieldType) { - std::string languageKey = LanguageManager::keyForLanguage(mLanguage); - update << "UPDATE users SET language = ? where id = ?", - bind(languageKey), use(mDBId); - } - try { - if (update.execute() == 1) return true; - addError(new ParamError("User::updateIntoDB", "update not affected 1 rows", fieldType)); - } - catch (Poco::Exception& ex) { - auto em = ErrorManager::getInstance(); - em->addError(new ParamError("User::updateIntoDB", "mysql error", ex.displayText().data())); - em->sendErrorsAsEmail(); - } - } - - return false; - -} - -bool User::loadEntryDBId(Poco::Data::Session session) -{ - auto em = ErrorManager::getInstance(); - Poco::Data::Statement select(session); - - select << "SELECT id from users where email = ?;", - into(mDBId), use(mEmail); - try { - if (select.execute() != 1) { - addError(new Error("User::loadEntryDBId", "didn't get expectet row count (1)")); - return false; - } - } catch(Poco::Exception& ex) { - em->addError(new ParamError("[User::loadEntryDBId]", "error selecting from db", ex.displayText().data())); - em->sendErrorsAsEmail(); - } - - return true; -} - -const char* User::userStateToString(UserStates state) -{ - switch (state) { - case USER_EMPTY: return "empty"; - case USER_LOADED_FROM_DB: return "loaded from db"; - case USER_PASSWORD_INCORRECT: return "password incorrect"; - case USER_EMAIL_NOT_ACTIVATED: return "email not activated"; - case USER_NO_KEYS: return "no keys"; - case USER_NO_PRIVATE_KEY: return "no private key"; - case USER_COMPLETE: return "complete"; - } - return "- unknown -"; -} - -MemoryBin* User::getPrivKey() -{ - if (!mPrivateKey) { - addError(new Error("User::getPrivKey", "no private key saved")); - return nullptr; - } - if (!hasCryptoKey()) { - addError(new Error("User::getPrivKey", "no crypto key set for decrypting priv key")); - return nullptr; - } - return decrypt(mPrivateKey); -} - -bool User::setPrivKey(const MemoryBin* privKey) -{ - if (!hasCryptoKey()) { - lock("User::setPrivKey"); - addError(new Error("User::getPrivKey", "no crypto key set for encrypting priv key")); - unlock(); - return false; - } - auto encyrptedPrivKey = encrypt(privKey); - lock("User::setPrivKey"); - mState = USER_COMPLETE; - mPrivateKey = encyrptedPrivKey;// encrypt(privKey); - unlock(); - - return true; -} - -void User::lock(const char* stateInfos/* = nullptr*/) -{ - try { - mWorkingMutex.lock(500); - } - catch (Poco::TimeoutException& ex) { - addError(new ParamError("User::lock", "timeout exception", ex.displayText())); - if (stateInfos) { - addError(new ParamError("User::lock", "stateInfos", stateInfos)); - } - sendErrorsAsEmail(); - } -} \ No newline at end of file diff --git a/src/cpp/model/User.h b/src/cpp/model/User.h deleted file mode 100644 index cc1a8be86..000000000 --- a/src/cpp/model/User.h +++ /dev/null @@ -1,272 +0,0 @@ -#ifndef GRADIDO_LOGIN_SERVER_MODEL_USER_INCLUDE -#define GRADIDO_LOGIN_SERVER_MODEL_USER_INCLUDE - -#include "../Crypto/KeyPair.h" -#include -//#include "ModelBase.h" -#include "../lib/NotificationList.h" - -#include "Poco/Thread.h" -#include "Poco/Types.h" -#include "Poco/Data/Session.h" -#include "Poco/JSON/Object.h" -#include "../tasks/CPUTask.h" - -#include "../SingletonManager/MemoryManager.h" -#include "../SingletonManager/LanguageManager.h" - -#include "../controller/User.h" - -class UserCreateCryptoKey; -class UserWriteIntoDB; -class Session; -class UserWriteCryptoKeyHashIntoDB; -class SigningTransaction; -class UserGenerateKeys; -class DebugPassphrasePage; -class RepairDefectPassphrase; - -enum UserStates -{ - USER_EMPTY, - USER_LOADED_FROM_DB, - USER_PASSWORD_INCORRECT, - USER_PASSWORD_ENCRYPTION_IN_PROCESS, - USER_EMAIL_NOT_ACTIVATED, - USER_NO_KEYS, - USER_NO_PRIVATE_KEY, - USER_KEYS_DONT_MATCH, - USER_COMPLETE, - USER_DISABLED -}; - -enum UserFields -{ - USER_FIELDS_ID, - USER_FIELDS_FIRST_NAME, - USER_FIELDS_LAST_NAME, - USER_FIELDS_PASSWORD, - USER_FIELDS_EMAIL_CHECKED, - USER_FIELDS_LANGUAGE -}; - -class User : public NotificationList -{ - friend UserCreateCryptoKey; - friend UserWriteIntoDB; - friend UserWriteCryptoKeyHashIntoDB; - friend SigningTransaction; - friend UserGenerateKeys; - friend DebugPassphrasePage; - friend RepairDefectPassphrase; -public: - // new user - User(const char* email, const char* first_name, const char* last_name); - // existing user - User(const char* email); - - // existing user by public key - User(const unsigned char* pubkey_array); - - User(int user_id); - - // load from controller user - User(Poco::AutoPtr ctrl_user); - - // login - //User(const std::string& email, const std::string& password); - - ~User(); - - void login(Poco::AutoPtr newUser); - - static std::string generateNewPassphrase(Mnemonic* word_source); - static bool validatePassphrase(const std::string& passphrase, Mnemonic** wordSource = nullptr); - static const char* userStateToString(UserStates state); - //static User* login(const std::string& email, const std::string& password, ErrorList* errorContainer = nullptr); - - bool generateKeys(bool savePrivkey, const std::string& passphrase, Session* session); - - bool loadEntryDBId(Poco::Data::Session session); - - bool deleteFromDB(); - - inline bool hasCryptoKey() { lock(); bool bRet = mCryptoKey != nullptr; unlock(); return bRet; } - - inline const char* getEmail() const { return mEmail.data(); } - inline const char* getFirstName() const { return mFirstName.data(); } - inline const char* getLastName() const { return mLastName.data(); } - inline int getDBId() const { return mDBId; } - inline int getBalance() { lock(); int balance = mGradidoCurrentBalance; unlock(); return balance; } - inline std::string getPublicKeyHex() { lock(); std::string pubkeyHex = mPublicHex; unlock(); return pubkeyHex; } - inline const unsigned char* getPublicKey() { return mPublicKey; } - inline Languages getLanguage() { lock(); Languages lang = mLanguage; unlock(); return lang; } - - inline void setPublicKeyHex(const std::string& publicKeyHex) { lock(); mPublicHex = publicKeyHex; unlock(); } - inline void setPublicKey(const unsigned char* key) { lock(); memcpy(mPublicKey, key, crypto_sign_PUBLICKEYBYTES); unlock();} - - inline const char* gettext(const char* text) { if (mLanguageCatalog.isNull()) return text; return mLanguageCatalog->gettext(text); } - - UserStates getUserState(); - - void setLanguage(Languages lang); - inline void setBalance(int balance) { lock(); mGradidoCurrentBalance = balance; unlock(); } - void setEmailChecked(); - bool isEmptyPassword(); - //bool setNewPassword(const std::string& newPassword); - bool updatePassword(const std::string& newPassword, const std::string& passphrase, Poco::AutoPtr newUser); - bool validatePwd(const std::string& pwd, NotificationList* validationErrorsToPrint); - bool validateIdentHash(HASH hash); - - MemoryBin* encrypt(const MemoryBin* data); - MemoryBin* decrypt(const MemoryBin* encryptedData); - MemoryBin* sign(const unsigned char* message, size_t messageSize); - - Poco::JSON::Object getJson(); - - // for poco auto ptr - void duplicate(); - void release(); - - //! \brief wait time create crypto key is normally running - static void fakeCreateCryptoKey(); -protected: - typedef Poco::UInt64 passwordHashed; - - MemoryBin* createCryptoKey(const std::string& password); - static passwordHashed createPasswordHashed(MemoryBin* cryptoKey, NotificationList* errorReceiver = nullptr); - inline void setCryptoKey(MemoryBin* cryptoKey) { lock(); mCryptoKey = cryptoKey; unlock(); } - - //void detectState(); - - Poco::Data::Statement insertIntoDB(Poco::Data::Session session); - bool updateIntoDB(UserFields fieldType); - inline passwordHashed getPwdHashed() { lock(); auto ret = mPasswordHashed; unlock(); return ret; } - inline void setPwdHashed(passwordHashed pwdHashed) { lock(); mPasswordHashed = pwdHashed; unlock(); } - - void lock(const char* stateInfos = nullptr); - inline void unlock() { mWorkingMutex.unlock(); } - - MemoryBin* getPrivKey(); - inline bool hasPrivKey() { lock(); bool result = false; if (mPrivateKey && mCryptoKey) result = true; unlock(); return result; } - bool setPrivKey(const MemoryBin* privKey); - -private: - Poco::AutoPtr mUserCtrl; - UserStates mState; - - // ************************* DB FIELDS ****************************** - int mDBId; - std::string mEmail; - std::string mFirstName; - std::string mLastName; - - passwordHashed mPasswordHashed; - - std::string mPublicHex; - unsigned char mPublicKey[crypto_sign_PUBLICKEYBYTES]; - //! crypted private key - MemoryBin* mPrivateKey; - // TODO: insert created if necessary - - bool mEmailChecked; - Languages mLanguage; - - // ************************ DB FIELDS END ****************************** - - int mGradidoCurrentBalance; - Poco::AutoPtr mLanguageCatalog; - - // crypto key as obfus array - // only in memory, if user has typed in password - MemoryBin* mCryptoKey; - - Poco::Mutex mWorkingMutex; - Poco::Mutex mReferenceMutex; - - // for poco auto ptr - int mReferenceCount; - - UniLib::controller::TaskPtr mCreateCryptoKeyTask; -}; - -class UserCreateCryptoKey : public UniLib::controller::CPUTask -{ -public: - UserCreateCryptoKey(Poco::AutoPtr user, Poco::AutoPtr newUser, const std::string& password, UniLib::controller::CPUSheduler* cpuScheduler); - - virtual int run(); - virtual const char* getResourceType() const { return "UserCreateCryptoKey"; }; - -private: - Poco::AutoPtr mUser; - Poco::AutoPtr mNewUser; - std::string mPassword; -}; - -class UserGenerateKeys : public UniLib::controller::CPUTask -{ -public: - UserGenerateKeys(Poco::AutoPtr user, Poco::AutoPtr newUser, const std::string& passphrase) - : mUser(user), mNewUser(newUser), mPassphrase(passphrase) { -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif - } - - ~UserGenerateKeys() { - - } - virtual int run(); - inline KeyPair* getKeyPairs() { return &mKeys; } - - virtual const char* getResourceType() const { return "UserGenerateKeys"; }; -protected: - Poco::AutoPtr mUser; - Poco::AutoPtr mNewUser; - std::string mPassphrase; - KeyPair mKeys; -}; - -class UserWriteIntoDB : public UniLib::controller::CPUTask -{ -public: - UserWriteIntoDB(Poco::AutoPtr user, UniLib::controller::CPUSheduler* cpuScheduler, size_t taskDependenceCount = 0) - : UniLib::controller::CPUTask(cpuScheduler, taskDependenceCount), mUser(user) { -#ifdef _UNI_LIB_DEBUG - setName(user->getEmail()); -#endif - } - - virtual int run(); - virtual const char* getResourceType() const { return "UserWriteIntoDB"; }; -private: - Poco::AutoPtr mUser; -}; - -class UserWriteKeysIntoDB : public UniLib::controller::CPUTask -{ -public: - UserWriteKeysIntoDB(std::vector parents, Poco::AutoPtr user, bool savePrivKey); - - virtual int run(); - - virtual const char* getResourceType() const { return "UserWriteKeysIntoDB"; }; -protected: - Poco::AutoPtr mUser; - bool mSavePrivKey; -}; - -class UserWriteCryptoKeyHashIntoDB : public UniLib::controller::CPUTask -{ -public: - UserWriteCryptoKeyHashIntoDB(Poco::AutoPtr user, int dependencieCount = 0); - - int run(); - const char* getResourceType() const { return "UserWriteCryptoKeyHashIntoDB"; }; - -protected: - Poco::AutoPtr mUser; -}; - -#endif //GRADIDO_LOGIN_SERVER_MODEL_USER_INCLUDE \ No newline at end of file diff --git a/src/cpp/model/table/User.cpp b/src/cpp/model/table/User.cpp index 11584659c..d45147532 100644 --- a/src/cpp/model/table/User.cpp +++ b/src/cpp/model/table/User.cpp @@ -17,8 +17,8 @@ namespace model { { } - User::User(const std::string& email, const std::string& first_name, const std::string& last_name, Poco::UInt64 passwordHashed/* = 0*/, std::string languageKey/* = "de"*/) - : mFirstName(first_name), mLastName(last_name), mPasswordHashed(passwordHashed), mEmailChecked(false), mLanguageKey(languageKey), mDisabled(false), mRole(ROLE_NOT_LOADED) + User::User(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed/* = 0*/, std::string languageKey/* = "de"*/) + : mFirstName(first_name), mLastName(last_name), mPasswordHashed(passwordHashed), mEmailChecked(false), mLanguageKey(languageKey), mDisabled(false), mGroupId(group_id), mRole(ROLE_NOT_LOADED) { setEmail(email); @@ -27,7 +27,7 @@ namespace model { User::User(UserTuple tuple) : ModelBase(tuple.get<0>()), mFirstName(tuple.get<1>()), mLastName(tuple.get<2>()), mEmail(tuple.get<3>()), - mPublicKey(tuple.get<4>()), mCreated(tuple.get<5>()), mEmailChecked(tuple.get<6>()), mDisabled(tuple.get<7>()), + mPublicKey(tuple.get<4>()), mCreated(tuple.get<5>()), mEmailChecked(tuple.get<6>()), mDisabled(tuple.get<7>()), mGroupId(tuple.get<8>()), mPasswordHashed(0), mLanguageKey("de"), mRole(ROLE_NOT_LOADED) { @@ -80,12 +80,12 @@ namespace model { if (mPasswordHashed) { - insert << "INSERT INTO users (email, first_name, last_name, password, email_hash, language) VALUES(?,?,?,?,?,?);", - use(mEmail), use(mFirstName), use(mLastName), bind(mPasswordHashed), use(mEmailHash), use(mLanguageKey); + insert << "INSERT INTO users (email, first_name, last_name, password, email_hash, language, group_id) VALUES(?,?,?,?,?,?,?);", + use(mEmail), use(mFirstName), use(mLastName), bind(mPasswordHashed), use(mEmailHash), use(mLanguageKey), use(mGroupId); } else { - insert << "INSERT INTO users (email, first_name, last_name, email_hash, language) VALUES(?,?,?,?,?);", - use(mEmail), use(mFirstName), use(mLastName), use(mEmailHash), use(mLanguageKey); + insert << "INSERT INTO users (email, first_name, last_name, email_hash, language, group_id) VALUES(?,?,?,?,?,?);", + use(mEmail), use(mFirstName), use(mLastName), use(mEmailHash), use(mLanguageKey), use(mGroupId); } return insert; @@ -98,13 +98,13 @@ namespace model { _fieldName = getTableName() + std::string(".id"); } Poco::Data::Statement select(session); - select << "SELECT " << getTableName() << ".id, email, first_name, last_name, password, pubkey, privkey, email_hash, created, email_checked, language, disabled, user_roles.role_id " + select << "SELECT " << getTableName() << ".id, email, first_name, last_name, password, pubkey, privkey, email_hash, created, email_checked, language, disabled, group_id, user_roles.role_id " << " FROM " << getTableName() << " LEFT JOIN user_roles ON " << getTableName() << ".id = user_roles.user_id " << " WHERE " << _fieldName << " = ?" , into(mID), into(mEmail), into(mFirstName), into(mLastName), into(mPasswordHashed), into(mPublicKey), into(mPrivateKey), into(mEmailHash), into(mCreated), into(mEmailChecked), - into(mLanguageKey), into(mDisabled), into(mRole); + into(mLanguageKey), into(mDisabled), into(mGroupId), into(mRole); return select; @@ -114,7 +114,7 @@ namespace model { { Poco::Data::Statement select(session); // typedef Poco::Tuple, int> UserTuple; - select << "SELECT id, first_name, last_name, email, pubkey, created, email_checked, disabled FROM " << getTableName() + select << "SELECT id, first_name, last_name, email, pubkey, created, email_checked, disabled, group_id FROM " << getTableName() << " where " << fieldName << " LIKE ?"; @@ -130,7 +130,7 @@ namespace model { } // typedef Poco::Tuple, int> UserTuple; - select << "SELECT id, first_name, last_name, email, pubkey, created, email_checked, disabled FROM " << getTableName() + select << "SELECT id, first_name, last_name, email, pubkey, created, email_checked, disabled, group_id FROM " << getTableName() << " where " << fieldNames[0] << " LIKE ?"; if (conditionType == MYSQL_CONDITION_AND) { for (int i = 1; i < fieldNames.size(); i++) { @@ -311,6 +311,7 @@ namespace model { ss << "email checked: " << mEmailChecked << std::endl; ss << "language key: " << mLanguageKey << std::endl; ss << "disabled: " << mDisabled << std::endl; + ss << "group id: " << std::to_string(mGroupId) << std::endl; mm->releaseMemory(pubkeyHex); mm->releaseMemory(privkeyHex); @@ -346,6 +347,7 @@ namespace model { ss << "language key: " << mLanguageKey << "
    "; ss << "role: " << UserRole::typeToString(getRole()) << "
    "; ss << "disabled: " << mDisabled << "
    "; + ss << "group_id: " << std::to_string(mGroupId) << std::endl; mm->releaseMemory(pubkeyHex); mm->releaseMemory(email_hash); @@ -369,6 +371,25 @@ namespace model { return pubkeyHexString; } + std::string User::getPrivateKeyEncryptedHex() const + { + std::shared_lock _lock(mSharedMutex); + auto mm = MemoryManager::getInstance(); + std::string privkeyHexString; + + if (!mPrivateKey.isNull()) { + auto priv_key_size = mPrivateKey.value().content().size(); + auto privkeyHex = mm->getFreeMemory(priv_key_size+1); + + memset(*privkeyHex, 0, priv_key_size+1); + sodium_bin2hex(*privkeyHex, 65, mPrivateKey.value().content().data(), priv_key_size); + privkeyHexString = std::string((const char*)privkeyHex->data(), privkeyHex->size() - 1); + mm->releaseMemory(privkeyHex); + } + + return privkeyHexString; + } + Poco::JSON::Object User::getJson() { diff --git a/src/cpp/model/table/User.h b/src/cpp/model/table/User.h index 9d95a3223..d4fb2ea87 100644 --- a/src/cpp/model/table/User.h +++ b/src/cpp/model/table/User.h @@ -29,14 +29,16 @@ namespace model { USER_FIELDS_LANGUAGE }; - typedef Poco::Tuple, Poco::DateTime, int, int> UserTuple; + typedef Poco::Tuple, Poco::DateTime, int, int, int> UserTuple; class User : public ModelBase { public: +#define SHARED_LOCK std::shared_lock _lock(mSharedMutex) +#define UNIQUE_LOCK std::unique_lock _lock(mSharedMutex) User(); User(UserTuple tuple); - User(const std::string& email, const std::string& first_name, const std::string& last_name, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); + User(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de"); ~User(); // generic db operations @@ -54,35 +56,38 @@ namespace model { size_t updateFieldsFromCommunityServer(); // default getter unlocked - inline const std::string getEmail() const { std::shared_lock _lock(mSharedMutex); return mEmail; } - inline const std::string getFirstName() const { std::shared_lock _lock(mSharedMutex); return mFirstName; } - inline const std::string getLastName() const { std::shared_lock _lock(mSharedMutex); return mLastName; } - inline std::string getNameWithEmailHtml() const { std::shared_lock _lock(mSharedMutex); return mFirstName + " " + mLastName + " <" + mEmail + ">"; } - inline const Poco::UInt64 getPasswordHashed() const { std::shared_lock _lock(mSharedMutex); return mPasswordHashed; } - inline RoleType getRole() const { std::shared_lock _lock(mSharedMutex); if (mRole.isNull()) return ROLE_NONE; return static_cast(mRole.value()); } - inline const unsigned char* getPublicKey() const { std::shared_lock _lock(mSharedMutex); if (mPublicKey.isNull()) return nullptr; return mPublicKey.value().content().data(); } - inline size_t getPublicKeySize() const { std::shared_lock _lock(mSharedMutex); if (mPublicKey.isNull()) return 0; return mPublicKey.value().content().size(); } + inline const std::string getEmail() const { SHARED_LOCK; return mEmail; } + inline const std::string getFirstName() const { SHARED_LOCK; return mFirstName; } + inline const std::string getLastName() const { SHARED_LOCK; return mLastName; } + inline std::string getNameWithEmailHtml() const { SHARED_LOCK; return mFirstName + " " + mLastName + " <" + mEmail + ">"; } + inline const Poco::UInt64 getPasswordHashed() const { SHARED_LOCK; return mPasswordHashed; } + inline RoleType getRole() const { SHARED_LOCK; if (mRole.isNull()) return ROLE_NONE; return static_cast(mRole.value()); } + inline const unsigned char* getPublicKey() const { SHARED_LOCK; if (mPublicKey.isNull()) return nullptr; return mPublicKey.value().content().data(); } + inline size_t getPublicKeySize() const { SHARED_LOCK; if (mPublicKey.isNull()) return 0; return mPublicKey.value().content().size(); } std::string getPublicKeyHex() const; + std::string getPrivateKeyEncryptedHex() const; - inline bool hasPrivateKeyEncrypted() const { std::shared_lock _lock(mSharedMutex); return !mPrivateKey.isNull(); } - inline bool hasEmailHash() const { std::shared_lock _lock(mSharedMutex); return !mEmailHash.isNull(); } - inline const std::vector& getPrivateKeyEncrypted() const { return mPrivateKey.value().content(); } - inline bool isEmailChecked() const { std::shared_lock _lock(mSharedMutex); return mEmailChecked; } - inline const std::string getLanguageKey() const { std::shared_lock _lock(mSharedMutex); return mLanguageKey; } - inline bool isDisabled() const { std::shared_lock _lock(mSharedMutex); return mDisabled; } + inline bool hasPrivateKeyEncrypted() const { SHARED_LOCK; return !mPrivateKey.isNull(); } + inline bool hasPublicKey() const { SHARED_LOCK; return !mPublicKey.isNull(); } + inline bool hasEmailHash() const { SHARED_LOCK; return !mEmailHash.isNull(); } + inline const std::vector& getPrivateKeyEncrypted() const { SHARED_LOCK; return mPrivateKey.value().content(); } + inline bool isEmailChecked() const { SHARED_LOCK; return mEmailChecked; } + inline const std::string getLanguageKey() const { SHARED_LOCK; return mLanguageKey; } + inline bool isDisabled() const { SHARED_LOCK; return mDisabled; } + inline int getGroupId() const { SHARED_LOCK; return mGroupId; } // default setter unlocked void setEmail(const std::string& email); - inline void setFirstName(const std::string& first_name) { std::unique_lock _lock(mSharedMutex); mFirstName = first_name; } - inline void setLastName(const std::string& last_name) { std::unique_lock _lock(mSharedMutex); mLastName = last_name; } - inline void setPasswordHashed(const Poco::UInt64& passwordHashed) { std::unique_lock _lock(mSharedMutex); mPasswordHashed = passwordHashed; } + inline void setFirstName(const std::string& first_name) { UNIQUE_LOCK; mFirstName = first_name; } + inline void setLastName(const std::string& last_name) { UNIQUE_LOCK; mLastName = last_name; } + inline void setPasswordHashed(const Poco::UInt64& passwordHashed) { UNIQUE_LOCK; mPasswordHashed = passwordHashed; } void setPublicKey(const unsigned char* publicKey); //! \brief set encrypted private key //! \param privateKey copy data, didn't move memory bin void setPrivateKey(const MemoryBin* privateKey); - inline void setEmailChecked(bool emailChecked) { std::unique_lock _lock(mSharedMutex); mEmailChecked = emailChecked; } - inline void setLanguageKey(const std::string& languageKey) { std::unique_lock _lock(mSharedMutex); mLanguageKey = languageKey; } - inline void setDisabled(bool disabled) { std::unique_lock _lock(mSharedMutex); mDisabled = disabled; } + inline void setEmailChecked(bool emailChecked) { UNIQUE_LOCK; mEmailChecked = emailChecked; } + inline void setLanguageKey(const std::string& languageKey) { UNIQUE_LOCK; mLanguageKey = languageKey; } + inline void setDisabled(bool disabled) { UNIQUE_LOCK; mDisabled = disabled; } Poco::JSON::Object getJson(); @@ -113,6 +118,8 @@ namespace model { //! if set to true, prevent login bool mDisabled; + int mGroupId; + // from neighbor tables Poco::Nullable mRole; diff --git a/src/cpp/tasks/SigningTransaction.h b/src/cpp/tasks/SigningTransaction.h index aaaeb9253..e3b659edd 100644 --- a/src/cpp/tasks/SigningTransaction.h +++ b/src/cpp/tasks/SigningTransaction.h @@ -5,7 +5,6 @@ #include "../lib/NotificationList.h" #include "../model/TransactionBase.h" -#include "../model/User.h" #include "../controller/User.h" #include "../proto/gradido/GradidoTransaction.pb.h" diff --git a/src/cpsp/Error500.cpsp b/src/cpsp/Error500.cpsp index 7cea4f563..0cc255eed 100644 --- a/src/cpsp/Error500.cpsp +++ b/src/cpsp/Error500.cpsp @@ -10,18 +10,18 @@ <% const char* pageName = "Error"; response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); - Poco::AutoPtr user; + Poco::AutoPtr user; if(mSession) { - auto user = mSession->getUser(); + auto user = mSession->getNewUser(); } %><%@ include file="header_old.cpsp" %>

    Ein Fehler auf dem Server trat ein, der Admin bekam eine E-Mail.

    <% if(mSession) { %> - <%= mSession->getErrorsHtml() %> + <%= mSession->getErrorsHtmlNewFormat() %> <% } %> <% if(!user.isNull()) {%> - <%= user->getErrorsHtml() %> + <%= user->getModel()->getErrorsHtmlNewFormat() %> <% } %>
    <%@ include file="footer.cpsp" %> diff --git a/src/cpsp/PassphrasedTransaction.cpsp b/src/cpsp/PassphrasedTransaction.cpsp index debc1f296..8c360da79 100644 --- a/src/cpsp/PassphrasedTransaction.cpsp +++ b/src/cpsp/PassphrasedTransaction.cpsp @@ -6,7 +6,7 @@ <%! #include "../SingletonManager/MemoryManager.h" #include "../SingletonManager/SessionManager.h" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" #include "../ServerConfig.h" #include "Poco/JSON/Object.h" @@ -23,29 +23,28 @@ enum PageState { <%% std::string pageName = "Gradidos mit Passphrase überweisen"; PageState state = PAGE_STATE_INPUT; - Mnemonic* wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER]; + Mnemonic* wordSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER_FIXED_CASES]; auto sm = SessionManager::getInstance(); auto mm = MemoryManager::getInstance(); std::string errorString =""; if(!form.empty()) { auto passphrase = form.get("passphrase", ""); - bool passphraseValid = User::validatePassphrase(passphrase, &wordSource); + auto passphrase_obj = Passphrase::create(passphrase, wordSource); + bool keysGenerated = false; - KeyPair keys; - if(!passphraseValid) - { + KeyPairEd25519* keys = nullptr; + if(!passphrase_obj.isNull()) { addError(new Error("Passphrase", "Fehler beim validieren der Passphrase")); } - else - { - keysGenerated = keys.generateFromPassphrase(passphrase.data(), wordSource); - if(!keysGenerated) + else { + keys = KeyPairEd25519::create(passphrase_obj); + if(!keys) { addError(new Error("Passphrase", "Konnte keine Keys aus der Passphrase generieren")); } } - if(passphraseValid && keysGenerated) + if(keys) { // create session only for transaction int session_id = 0; @@ -53,7 +52,7 @@ enum PageState { // create payload Poco::JSON::Object requestJson; Poco::JSON::Object pubkeys; - pubkeys.set("sender", keys.getPubkeyHex()); + pubkeys.set("sender", keys->getPublicKeyHex()); pubkeys.set("receiver", form.get("recevier", "")); requestJson.set("method", "moveTransaction"); requestJson.set("pubkeys", pubkeys); @@ -129,6 +128,8 @@ enum PageState { if(session) { sm->releaseSession(session); } + delete keys; + keys = nullptr; } } diff --git a/src/cpsp/adminCheckUserBackup.cpsp b/src/cpsp/adminCheckUserBackup.cpsp index 35ac38ad4..66156796d 100644 --- a/src/cpsp/adminCheckUserBackup.cpsp +++ b/src/cpsp/adminCheckUserBackup.cpsp @@ -5,10 +5,11 @@ <%@ page ctorArg="Session*" %> <%@ header include="SessionHTTPRequestHandler.h" %> <%! -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" +#include "../Crypto/Passphrase.h" #include "../SingletonManager/ConnectionManager.h" -#include "../controller/UserBackups.h" +#include "../controller/UserBackup.h" #include "Poco/Data/Binding.h" using namespace Poco::Data::Keywords; @@ -25,7 +26,7 @@ struct SListEntry <%% const char* pageName = "Admin Check User Backups"; auto cm = ConnectionManager::getInstance(); - KeyPair keys; + std::list notMatchingEntrys; auto con = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER); @@ -44,21 +45,24 @@ struct SListEntry if(pubkey.isNull()) { continue; } - auto passphrase = KeyPair::filterPassphrase(tuple.get<2>()); + auto passphrase = Passphrase::filter(tuple.get<2>()); auto user_id = tuple.get<0>(); - Mnemonic* wordSource = nullptr; - if(!User::validatePassphrase(passphrase, &wordSource)) { + KeyPairEd25519 key_pair(pubkey.value().content().data()); + + auto wordSource = Passphrase::detectMnemonic(passphrase); + if(!wordSource) { addError(new Error("admin Check user backup", "invalid passphrase"), false); addError(new ParamError("admin Check user backup", "passphrase", passphrase.data()), false); addError(new ParamError("admin Check user backup", "user id", user_id), false); continue; - } else { - keys.generateFromPassphrase(passphrase.data(), wordSource); - } + } + auto passphrase_object = Passphrase::create(passphrase, wordSource); + auto key_pair_from_passhrase = KeyPairEd25519::create(passphrase_object); bool matching = false; - if(keys.isPubkeysTheSame(pubkey.value().content().data())) { + if(key_pair_from_passhrase->isTheSame(key_pair)) { matching = true; } + delete key_pair_from_passhrase; if(user_id != last_user_id) { last_user_id = user_id; if(matching) continue; diff --git a/src/cpsp/adminUserPasswordReset.cpsp b/src/cpsp/adminUserPasswordReset.cpsp index f534b8c4d..7022b42d9 100644 --- a/src/cpsp/adminUserPasswordReset.cpsp +++ b/src/cpsp/adminUserPasswordReset.cpsp @@ -8,7 +8,7 @@ // includes #include "../controller/User.h" #include "../controller/EmailVerificationCode.h" -#include "../controller/UserBackups.h" +#include "../controller/UserBackup.h" enum PageState @@ -47,11 +47,11 @@ enum PageState } } - auto backups = controller::UserBackups::load(userId); + auto backups = controller::UserBackup::load(userId); auto userPubkey = user->getModel()->getPublicKey(); for(auto it = backups.begin(); it != backups.end(); it++) { auto keys = (*it)->getKeyPair(); - if(keys->isPubkeysTheSame(userPubkey)) { + if(keys->isTheSame(userPubkey)) { userBackup = *it; break; } @@ -102,7 +102,7 @@ enum PageState hier findest du deine Passphrase mit dessen Hilfe du dir ein neues Passwort einstellen kannst. Bitte schreibe sie dir auf und packe sie gut weg. -<%= controller::UserBackups::formatPassphrase(userBackup->getPassphrase(ServerConfig::Mnemonic_Types::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER)) %> +<%= controller::UserBackup::formatPassphrase(userBackup->getPassphrase(ServerConfig::Mnemonic_Types::MNEMONIC_GRADIDO_BOOK_GERMAN_RANDOM_ORDER)) %> diff --git a/src/cpsp/checkTransaction.cpsp b/src/cpsp/checkTransaction.cpsp index 77d61a1ba..ef121dcb4 100644 --- a/src/cpsp/checkTransaction.cpsp +++ b/src/cpsp/checkTransaction.cpsp @@ -163,8 +163,10 @@ enum PageState { <%= gettext("Gradido") %>
    - <% if(transactionUser) { %> - <%= transactionUser->getFirstName() %> <%= transactionUser->getLastName() %> <<%= transactionUser->getEmail() %>> + <% if(!transactionUser.isNull()) { + auto user_model = transactionUser->getModel(); + %> + <%= user_model->getFirstName() %> <%= user_model->getLastName() %> <<%= user_model->getEmail() %>> <% } else { %> 0x<%= creationTransaction->getPublicHex() %> <% } %> diff --git a/src/cpsp/dashboard.cpsp b/src/cpsp/dashboard.cpsp index 687c6a709..654f7a4c3 100644 --- a/src/cpsp/dashboard.cpsp +++ b/src/cpsp/dashboard.cpsp @@ -10,6 +10,8 @@ %> <%% const char* pageName = "Dashboard"; + auto user = mSession->getNewUser(); + auto user_model = user->getModel(); //Poco::Net::NameValueCollection cookies; //request.getCookies(cookies); if(!form.empty()) { @@ -20,7 +22,7 @@ return; %><%@ include file="header_old.cpsp" %>
    -

    Willkommen <%= mSession->getUser()->getFirstName() %> <%= mSession->getUser()->getLastName() %>

    +

    Willkommen <%= user_model->getFirstName() %> <%= user_model->getLastName() %>

    <%= mSession->getErrorsHtml() %>

    Status

    <%= mSession->getSessionStateString() %>

    diff --git a/src/cpsp/debugMnemonic.cpsp b/src/cpsp/debugMnemonic.cpsp index 06f0c5f86..aa52d4561 100644 --- a/src/cpsp/debugMnemonic.cpsp +++ b/src/cpsp/debugMnemonic.cpsp @@ -6,7 +6,7 @@ <%@ header include="SessionHTTPRequestHandler.h" %> <%! #include "../ServerConfig.h" -#include "../Crypto/KeyPair.h" +#include "../Crypto/Passphrase.h" struct WordChecked { WordChecked() : index(0), bSet(false) {}; @@ -48,7 +48,7 @@ { if("" != form.get("check_word", "")) { - auto word = KeyPair::filterPassphrase(form.get("word", "")); + auto word = Passphrase::filter(form.get("word", "")); if("" != word) { checkedWord.bSet = true; checkedWord.word = word; diff --git a/src/cpsp/debugPassphrase.cpsp b/src/cpsp/debugPassphrase.cpsp index 936a4629f..416bdf0a3 100644 --- a/src/cpsp/debugPassphrase.cpsp +++ b/src/cpsp/debugPassphrase.cpsp @@ -5,45 +5,36 @@ <%@ page ctorArg="Session*" %> <%@ header include="SessionHTTPRequestHandler.h" %> <%! -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" +#include "../controller/User.h" %> <%% const char* pageName = "Debug Passphrase"; - auto mm = MemoryManager::getInstance(); - KeyPair keys; - std::string privKeyHex = ""; + + KeyPairEd25519* keys = nullptr; std::string privKeyCryptedHex = ""; - User::passwordHashed pwdHashed = 0; + Poco::UInt64 pwdHashed = 0; Poco::AutoPtr existingUser; if(!form.empty()) { - auto passphrase = KeyPair::filterPassphrase(form.get("passphrase", "")); - Mnemonic* wordSource = nullptr; - if(!User::validatePassphrase(passphrase, &wordSource)) { + auto passphrase_string = form.get("passphrase", ""); + auto wordSource = Passphrase::detectMnemonic(passphrase_string); + if(!wordSource) { addError(new Error("debug Passphrase", "invalid passphrase"), false); } else { - keys.generateFromPassphrase(passphrase.data(), wordSource); + keys = KeyPairEd25519::create(Passphrase::create(passphrase_string, wordSource)); } auto email = form.get("email", ""); - auto newUser = new User(email.data(), "first_name", "last_name"); - if(email != "") { existingUser = controller::User::create(); - existingUser->load(email); - } - newUser->validatePwd(form.get("password", ""), this); - pwdHashed = newUser->getPwdHashed(); - auto privKey = keys.getPrivateKey(); - if(privKey) { - privKeyHex = KeyPair::getHex(privKey); - auto privKeyCrypted = newUser->encrypt(privKey); - if(privKeyCrypted) { - privKeyCryptedHex = KeyPair::getHex(privKeyCrypted); - mm->releaseMemory(privKeyCrypted); + if(1 == existingUser->load(email)) { + auto user_model = existingUser->getModel(); + pwdHashed = user_model->getPasswordHashed(); + if(user_model->hasPrivateKeyEncrypted()) { + privKeyCryptedHex = user_model->getPrivateKeyEncryptedHex(); + } } } - getErrors(newUser); - delete newUser; } @@ -58,23 +49,21 @@ "/>

    -

    - - -

    -

    Public key:
    <%= keys.getPubkeyHex() %>

    -

    Private Key:
    <%= privKeyHex %>

    -

    Passwort Hashed:
    <%= std::to_string(pwdHashed) %>

    -

    Private key crypted:
    <%= privKeyCryptedHex %>

    - <% if(!existingUser.isNull()) { - auto userModel = existingUser->getModel(); - auto dbPubkey = userModel->getPublicKey(); - %> -

    user Public:
    <%= KeyPair::getHex(dbPubkey, ed25519_pubkey_SIZE) %>

    + <% if(keys) { %> +

    Public key:
    <%= keys->getPublicKeyHex() %>

    +

    Private key crypted:
    <%= privKeyCryptedHex %>

    +

    Passwort Hashed:
    <%= std::to_string(pwdHashed) %>

    + <% if(!existingUser.isNull()) { + auto userModel = existingUser->getModel(); + auto dbPubkey = userModel->getPublicKey(); + %> +

    user Public:
    <%= keys->getPublicKeyHex() %>

    + <% } %> <% } %>
    +<% if(keys) delete keys; %> <%@ include file="footer.cpsp" %> diff --git a/src/cpsp/login.cpsp b/src/cpsp/login.cpsp index 70018bc79..fa9b4258b 100644 --- a/src/cpsp/login.cpsp +++ b/src/cpsp/login.cpsp @@ -26,8 +26,8 @@ auto langCatalog = lm->getFreeCatalog(lang); std::string presetEmail(""); - if(mSession && mSession->getUser()) { - presetEmail = mSession->getUser()->getEmail(); + if(mSession && mSession->getNewUser()) { + presetEmail = mSession->getNewUser()->getModel()->getEmail(); } if(!form.empty()) { @@ -114,6 +114,9 @@ } sm->deleteLoginCookies(request, response); break; + case USER_NO_GROUP: + response.redirect(ServerConfig::g_serverPath + "/userUpdateGroup"); + return; case USER_NO_PRIVATE_KEY: case USER_COMPLETE: case USER_EMAIL_NOT_ACTIVATED: diff --git a/src/cpsp/passphrase.cpsp b/src/cpsp/passphrase.cpsp index d941bffcd..e8079fec9 100644 --- a/src/cpsp/passphrase.cpsp +++ b/src/cpsp/passphrase.cpsp @@ -7,7 +7,7 @@ <%! #include "../SingletonManager/SessionManager.h" #include "../SingletonManager/LanguageManager.h" -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" #include "../ServerConfig.h" //#include "Poco/Net/HTTPServerParams.h" @@ -68,13 +68,15 @@ enum PageState auto registerKeyChoice = form.get("passphrase", "no"); std::string oldPassphrase = ""; if (registerKeyChoice == "no") { - auto oldPassphrase = KeyPair::filterPassphrase(form.get("passphrase-existing", "")); + auto oldPassphrase = Passphrase::filter(form.get("passphrase-existing", "")); if(oldPassphrase != "") { - if (User::validatePassphrase(oldPassphrase, &wordSource)) { + auto word_source = Passphrase::detectMnemonic(oldPassphrase); + if (word_source) { // passphrase is valid if(PAGE_FORCE_ASK_PASSPHRASE == state) { - auto compareResult = mSession->comparePassphraseWithSavedKeys(oldPassphrase, wordSource); + + auto compareResult = mSession->comparePassphraseWithSavedKeys(oldPassphrase, word_source); if(-2 == compareResult) { response.redirect(ServerConfig::g_serverPath + "/error500"); return; @@ -96,7 +98,8 @@ enum PageState } } else if (registerKeyChoice == "yes") { - mSession->generatePassphrase(); + auto passphrase = Passphrase::generate(wordSource); + mSession->setPassphrase(passphrase); } } } @@ -104,7 +107,7 @@ enum PageState // double check passphrase auto passphrase = mSession->getOldPassphrase(); auto langWordSource = wordSource; - if("" != passphrase && !User::validatePassphrase(passphrase, &wordSource)) { + if("" != passphrase && !Passphrase::detectMnemonic(passphrase)) { addError(new Error("PassphrasePage", "Invalid Passphrase after double check")); addError(new ParamError("PassphrasePage", "passphrase", passphrase.data())); if(!mSession->getNewUser().isNull()) { @@ -117,8 +120,8 @@ enum PageState } //printf("wordSource: %d, langWordSource: %d\n", (int)wordSource, (int)langWordSource); if(wordSource != langWordSource) { - mSession->generatePassphrase(); - User::validatePassphrase(passphrase, &wordSource); + //mSession->generatePassphrase(); + mSession->setPassphrase(Passphrase::generate(wordSource)); } if(mSession->getSessionState() == SESSION_STATE_PASSPHRASE_GENERATED && state != PAGE_ASK_ENSURE_PASSPHRASE) { @@ -160,7 +163,7 @@ enum PageState
    <%= gettext("Deine Passphrase (Groß/Kleinschreibung beachten)") %>:
    -

    <%= mSession->getPassphrase() %>

    +

    <%= mSession->getPassphrase()->getString() %>

    <%= gettext("Was zu tun ist:") %>
    @@ -212,7 +215,7 @@ enum PageState
    diff --git a/src/cpsp/registerAdmin.cpsp b/src/cpsp/registerAdmin.cpsp index 6f1db5b76..495de5a14 100644 --- a/src/cpsp/registerAdmin.cpsp +++ b/src/cpsp/registerAdmin.cpsp @@ -6,22 +6,41 @@ <%@ header include="SessionHTTPRequestHandler.h" %> <%! #include "../SingletonManager/SessionManager.h" +#include "../controller/Group.h" +#include "../lib/DataTypeConverter.h" + #include "Poco/Net/HTTPCookie.h" + %> <%% const char* pageName = "Admin Registrieren"; - //auto sm = SessionManager::getInstance(); + auto sm = SessionManager::getInstance(); bool userReturned = false; if(!form.empty()) { - userReturned = mSession->adminCreateUser( - form.get("register-first-name", ""), - form.get("register-last-name", ""), - form.get("register-email", "") - ); - getErrors(mSession); + auto group_id_string = form.get("register-group", "0"); + int group_id = 0; + if(!sm->isValid(group_id_string, VALIDATE_ONLY_INTEGER)) { + addError(new Error("Group id", "group_id not integer")); + } else { + if(DataTypeConverter::strToInt(group_id_string, group_id) != DataTypeConverter::NUMBER_PARSE_OKAY) { + addError(new Error("Int Convert Error", "Error converting group_id to int")); + } + } + if(!errorCount()) { + userReturned = mSession->adminCreateUser( + form.get("register-first-name", ""), + form.get("register-last-name", ""), + form.get("register-email", ""), + group_id + ); + getErrors(mSession); + } + } + + auto groups = controller::Group::listAll(); %><%@ include file="header_old.cpsp" %> @@ -52,6 +71,12 @@ "/>

    + diff --git a/src/cpsp/registerDirect.cpsp b/src/cpsp/registerDirect.cpsp index 6eadb19dc..f6c3dc49a 100644 --- a/src/cpsp/registerDirect.cpsp +++ b/src/cpsp/registerDirect.cpsp @@ -5,7 +5,10 @@ <%@ header include="PageRequestMessagedHandler.h" %> <%! #include "../SingletonManager/SessionManager.h" +#include "../controller/Group.h" +#include "../lib/DataTypeConverter.h" #include "Poco/Net/HTTPCookie.h" + %> <%% const char* pageName = "Registrieren"; @@ -24,12 +27,22 @@ session->setClientIp(user_host); response.addCookie(session->getLoginCookie()); } + auto group_id_string = form.get("register-group", "0"); + int group_id = 0; + if(!sm->isValid(group_id_string, VALIDATE_ONLY_INTEGER)) { + addError(new Error("Group id", "group_id not integer")); + } else { + if(DataTypeConverter::strToInt(group_id_string, group_id) != DataTypeConverter::NUMBER_PARSE_OKAY) { + addError(new Error("Int Convert Error", "Error converting group_id to int")); + } + } userReturned = session->createUserDirect( form.get("register-first-name", ""), form.get("register-last-name", ""), form.get("register-email", ""), - form.get("register-password", "") + form.get("register-password", ""), + group_id ); getErrors(session); @@ -48,6 +61,9 @@ // remove old cookies if exist sm->deleteLoginCookies(request, response); } + + auto groups = controller::Group::listAll(); + %><%@ include file="header.cpsp" %> <%= getErrorsHtml() %>
    @@ -67,6 +83,13 @@ +
    diff --git a/src/cpsp/saveKeys.cpsp b/src/cpsp/saveKeys.cpsp index 03fe1b763..d157ceaed 100644 --- a/src/cpsp/saveKeys.cpsp +++ b/src/cpsp/saveKeys.cpsp @@ -19,7 +19,8 @@ enum PageState const char* pageName = "Daten auf Server speichern?"; bool hasErrors = mSession->errorCount() > 0; // crypto key only in memory, if user has tipped in his passwort in this session - bool hasPassword = mSession->getUser()->hasCryptoKey(); + auto user = mSession->getNewUser(); + bool hasPassword = user->getModel()->hasPrivateKeyEncrypted(); PageState state = PAGE_ASK; auto uri_start = ServerConfig::g_php_serverPath;//request.serverParams().getServerName(); @@ -123,7 +124,7 @@ enum PageState Zurück zur Startseite
diff --git a/src/cpsp/translatePassphrase.cpsp b/src/cpsp/translatePassphrase.cpsp index ad22a8e90..f8dd20a6a 100644 --- a/src/cpsp/translatePassphrase.cpsp +++ b/src/cpsp/translatePassphrase.cpsp @@ -5,7 +5,7 @@ <%@ page form="true" %> <%@ page compressed="true" %> <%! -#include "../Crypto/KeyPair.h" +#include "../Crypto/KeyPairEd25519.h" #include "../ServerConfig.h" %> <%% @@ -29,16 +29,17 @@ { inputPassphrase = form.get("inputPassphrase", ""); - auto localPassphrase = KeyPair::filterPassphrase(inputPassphrase); + auto localPassphrase = Passphrase::filter(inputPassphrase); auto btnGenerate = form.get("btnGenerate", ""); if("" != btnGenerate) { - mSession->generatePassphrase(); - localPassphrase = mSession->getOldPassphrase(); + auto passphrase_gen = Passphrase::generate(wordSource); + + localPassphrase = passphrase_gen->getString(); inputPassphrase = localPassphrase; } - - if(localPassphrase != "" && !User::validatePassphrase(localPassphrase, &wordSource)) { + auto passphrase_object = Passphrase::create(localPassphrase, wordSource); + if(localPassphrase != "" && passphrase_object.isNull() || !passphrase_object->checkIfValid()) { addError(new Error( gettext("Fehler"), gettext("Diese Passphrase ist ungültig, bitte überprüfen oder neu generieren (lassen).") @@ -49,7 +50,8 @@ } else { targetSource = &ServerConfig::g_Mnemonic_WordLists[ServerConfig::MNEMONIC_BIP0039_SORTED_ORDER]; } - passphrase = KeyPair::passphraseTransform(localPassphrase, wordSource, targetSource); + auto transformed_passphrase_obj = passphrase_object->transform(targetSource); + passphrase = transformed_passphrase_obj->getString(); } diff --git a/src/cpsp/updateUser.cpsp b/src/cpsp/updateUser.cpsp deleted file mode 100644 index 43e3a311a..000000000 --- a/src/cpsp/updateUser.cpsp +++ /dev/null @@ -1,69 +0,0 @@ -<%@ page class="UpdateUserPage" %> -<%@ page form="true" %> -<%@ page baseClass="SessionHTTPRequestHandler" %> -<%@ page ctorArg="Session*" %> -<%@ header include="SessionHTTPRequestHandler.h" %> -<%@ page compressed="true" %> -<%! -#include "../SingletonManager/SessionManager.h" -#include "Poco/Net/HTTPCookie.h" -#include "../model/Profiler.h" -%> -<%% - const char* pageName = "Update"; - Profiler timeUsed; - auto user = mSession->getUser(); - - if(!form.empty()) { - auto pwd = form.get("update-password", ""); - if(pwd != "") { - if(pwd != form.get("update-password", "")) { - session->addError(new Error("Passwort", "Passwörter sind nicht identisch.")); - } else { - userReturned = session->getUser()->setNewPassword( - form.get("update-password") - ); - } - } - } -%><%@ include file="header.cpsp" %> -
-

Einen neuen Account anlegen

- <% if(!form.empty()) {%> -
-
- .. -
-
- <% } else { %> -
- - <% if(!form.empty() && !userReturned) {%> - <%= session->getErrorsHtml() %> - <%} %> -
- Account anlegen -

Bitte gebe deine Daten um einen Account anzulegen

-

- - "/> -

-

- - "/> -

-

- - -

-

- - -

-
- - - - <% } %> -
-<%@ include file="footer.cpsp" %> diff --git a/src/cpsp/userUpdateGroup.cpsp b/src/cpsp/userUpdateGroup.cpsp new file mode 100644 index 000000000..1fb1c4105 --- /dev/null +++ b/src/cpsp/userUpdateGroup.cpsp @@ -0,0 +1,62 @@ +<%@ page class="UserUpdateGroupPage" %> +<%@ page baseClass="SessionHTTPRequestHandler" %> +<%@ page ctorArg="Session*" %> +<%@ header include="SessionHTTPRequestHandler.h" %> +<%@ page compressed="true" %> +<%! + +#include "../controller/Group.h" +#include "../SingletonManager/SessionManager.h" + +enum PageState { + PAGE_STATE_OVERVIEW, + PAGE_STATE_REQUEST_IS_RUNNING +}; + +%> +<%% + const char* pageName = gettext("Gruppe wählen"); + auto user = mSession->getNewUser(); + auto sm = SessionManager::getInstance(); + PageState state = PAGE_STATE_OVERVIEW; + + if(!form.empty()) { + } + + auto groups = controller::Group::listAll(); + + +%><%@ include file="header_large.cpsp" %> +<%= getErrorsHtml() %> +
+ <% if(PAGE_STATE_OVERVIEW == state ) { %> +
+

<%= gettext("Gruppe wählen") %>

+
+

<%= gettext("Bitte wähle die Gruppe/Gemeinschaft aus, zu der du gehörst.") %>

+

<%= gettext("Du bekommst eine Bestätigungsmail, nachdem dein Beitritt bestätigt wurde.") %>

+
+
+
+
<%= gettext("Auswahl") %>
+
Name
+
Alias
+
Url
+
<%= gettext("Description") %>
+
+ <% for(auto it = groups.begin(); it != groups.end(); it++) { + auto group_model = (*it)->getModel(); %> +
+
+
<%= group_model->getName() %>
+
<%= group_model->getAlias() %>
+
<%= group_model->getUrl() %>
+
<%= group_model->getDescription()%>
+
+ <% } %> + "/> +
+ + <% } %> +
+<%@ include file="footer.cpsp" %> diff --git a/src/cpsp/updateUserPassword.cpsp b/src/cpsp/userUpdatePassword.cpsp similarity index 98% rename from src/cpsp/updateUserPassword.cpsp rename to src/cpsp/userUpdatePassword.cpsp index 364b21c7f..0bb915a52 100644 --- a/src/cpsp/updateUserPassword.cpsp +++ b/src/cpsp/userUpdatePassword.cpsp @@ -1,4 +1,4 @@ -<%@ page class="UpdateUserPasswordPage" %> +<%@ page class="UserUpdatePasswordPage" %> <%@ page baseClass="SessionHTTPRequestHandler" %> <%@ page ctorArg="Session*" %> <%@ header include="SessionHTTPRequestHandler.h" %>
"; -#line 102 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 106 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( userModel->getID() ); responseStream << ""; -#line 103 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 107 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( userModel->getFirstName() ); responseStream << ""; -#line 104 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 108 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( userModel->getLastName() ); responseStream << ""; -#line 105 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 109 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( userModel->getEmail() ); responseStream << ""; -#line 106 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" +#line 110 "F:\\Gradido\\gradido_login_server\\src\\cpsp\\adminCheckUserBackup.cpsp" responseStream << ( (*it).backups.size() ); responseStream << "