diff --git a/.gitignore b/.gitignore index b12f322a2..5c23ad8bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.log -/node_modules/* \ No newline at end of file +/node_modules/* +.vscode diff --git a/CHANGELOG.md b/CHANGELOG.md index 26f8f465f..8c943ecd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,18 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [0.9.4](https://github.com/gradido/gradido/compare/0.9.3...0.9.4) + +- Build on run [`#103`](https://github.com/gradido/gradido/pull/103) +- update debug docker to use dependencies container pushed to docker hub [`1f002f4`](https://github.com/gradido/gradido/commit/1f002f4ed0b12d4b2bf63efceabe546d0c5b58ea) +- removed email tasks complete [`8a143be`](https://github.com/gradido/gradido/commit/8a143be8423d7bd894d4f512848895df8b9694b0) +- build login-server on docker-compose up in a docker volume so it rebuild only neccessary parts if some c++ files have changed [`0da5279`](https://github.com/gradido/gradido/commit/0da527917523530186e6effe63dc001fc99bd3e3) + #### [0.9.3](https://github.com/gradido/gradido/compare/0.9.2...0.9.3) +> 30 March 2021 + +- new version 0.9.3 [`#110`](https://github.com/gradido/gradido/pull/110) - feat: Frontend tests for Content Footer [`#102`](https://github.com/gradido/gradido/pull/102) - add check session state json function and doc [`#96`](https://github.com/gradido/gradido/pull/96) - activity page stap 2 [`#86`](https://github.com/gradido/gradido/pull/86) diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php index 4afeabd8b..da2a58e65 100644 --- a/community_server/src/Controller/StateBalancesController.php +++ b/community_server/src/Controller/StateBalancesController.php @@ -39,32 +39,143 @@ class StateBalancesController extends AppController $this->set(compact('stateBalances')); } - private function updateBalances($state_user_id) + private function updateBalances($stateUserId) { - $state_balances = $this->StateBalances->find('all')->where(['state_user_id' => $state_user_id]); - if($state_balances->count() == 1) { - $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); - $state_user_transactions = $stateUserTransactionsTable + $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); + $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); + // info: cakephp use lazy loading, query will be executed later only if needed + $state_balances = $this->StateBalances->find('all')->where(['state_user_id' => $stateUserId]); + $state_user_transactions = $stateUserTransactionsTable ->find('all') - ->where(['state_user_id' => $state_user_id]) + ->where(['state_user_id' => $stateUserId]) ->order(['transaction_id ASC']) - ->contain(['']); - if($state_user_transactions->count() == 0){ - return; - } - $last_state_user_transaction = $state_user_transactions->last(); - $last_transaction = $this->StateBalance->newEntity(); - $last_transaction->amount = $last_state_user_transaction->balance; - $last_transaction->record_date = $last_state_user_transaction->balance_date; - // if entrys are nearly the same, we don't need doing anything - if(abs($last_transaction->decay - $state_balances->decay) < 100) { - return; - } - foreach($state_user_transactions as $state_user_transaction) { - - } - + ->contain(false); + + if(!$state_user_transactions) { + //debug($state_user_transactions); + return true; } + + // first: decide what todo + $create_state_balance = false; + $recalculate_state_user_transactions_balance = false; + $clear_state_balance = false; + $update_state_balance = false; + if($state_balances->count() == 0) { + $create_state_balance = true; + } + if($state_balances->count() > 1) { + $clear_state_balance = true; + $create_state_balance = true; + } + if($state_balances->count() == 1) { + if($state_user_transactions->count() == 0){ + $clear_state_balance = true; + } else { + $last_state_user_transaction = $state_user_transactions->last(); + $last_transaction = $this->StateBalances->newEntity(); + $last_transaction->amount = $last_state_user_transaction->balance; + $last_transaction->record_date = $last_state_user_transaction->balance_date; + // if entrys are nearly the same, we don't need doing anything + if(abs($last_transaction->decay - $state_balances->first()->decay) > 100) { + $recalculate_state_user_transactions_balance = true; + $update_state_balance = true; + } + } + } + + if(!$recalculate_state_user_transactions_balance) { + $last_state_user_transaction = $state_user_transactions->last(); + if($last_state_user_transaction->balance <= 0) { + $recalculate_state_user_transactions_balance = true; + if(!$create_state_balance) { + $update_state_balance = true; + } + } + } + // second: do what is needed + if($clear_state_balance) { + $this->StateBalances->deleteAll(['state_user_id' => $stateUserId]); + } + + $transaction_ids = []; + if($recalculate_state_user_transactions_balance) { + $state_user_transactions_array = $state_user_transactions->toArray(); + foreach($state_user_transactions_array as $i => $state_user_transaction) { + $transaction_ids[$state_user_transaction->transaction_id] = $i; + } + + $transactions = $transactionsTable + ->find('all') + ->where(['id IN' => array_keys($transaction_ids)]) + ->contain(['TransactionCreations', 'TransactionSendCoins']); + + $balance_cursor = $this->StateBalances->newEntity(); + $i = 0; + foreach($transactions as $transaction) { + if($transaction->transaction_type_id > 2) { + continue; + } + $amount_date = null; + $amount = 0; + + if($transaction->transaction_type_id == 1) { + $temp = $transaction->transaction_creations[0]; + + $balance_temp = $this->StateBalances->newEntity(); + $balance_temp->amount = $temp->amount; + $balance_temp->record_date = $temp->target_date; + + $amount = $balance_temp->partDecay($transaction->received); + $amount_date = $transaction->received; + //$amount_date = + } else if($transaction->transaction_type_id == 2) { + $temp = $transaction->transaction_send_coins[0]; + $amount = intval($temp->amount); + // reverse if sender + if($stateUserId == $temp->state_user_id) { + $amount *= -1.0; + } + $amount_date = $transaction->received; + } + if($i == 0) { + $balance_cursor->amount = $amount; + } else { + $balance_cursor->amount = $balance_cursor->partDecay($amount_date) + $amount; + } + $balance_cursor->record_date = $amount_date; + $state_user_transaction_index = $transaction_ids[$transaction->id]; + $state_user_transactions_array[$state_user_transaction_index]->balance = $balance_cursor->amount; + $state_user_transactions_array[$state_user_transaction_index]->balance_date = $balance_cursor->record_date; + $i++; + } + $results = $stateUserTransactionsTable->saveMany($state_user_transactions_array); + $errors = []; + foreach($results as $i => $result) { + if(!$result) { + $errors[$i] = $state_user_transactions_array[$i]->getErrors(); + } + } + if(count($errors)) { + return ['success' => false, 'error' => 'error saving one ore more state user transactions', 'details' => $errors]; + } + } + $state_balance = null; + if($update_state_balance) { + $state_balance = $state_balances->first(); + } + else if($create_state_balance) { + $state_balance = $this->StateBalances->newEntity(); + $state_balance->state_user_id = $stateUserId; + } + if($state_balance) { + $state_balance->amount = $state_user_transactions->last()->balance; + $state_balance->record_date = $state_user_transactions->last()->balance_date; + if(!$this->StateBalances->save($state_balance)) { + return ['success' => false, 'error' => 'error saving state balance', 'details' => $state_balance->getErrors()]; + } + } + return true; } public function overview() @@ -82,7 +193,9 @@ class StateBalancesController extends AppController if ($result !== true) { return $result; } + $user = $session->read('StateUser'); + $this->updateBalances($user['id']); // sendRequestGDT // listPerEmailApi @@ -214,6 +327,7 @@ class StateBalancesController extends AppController } $session = $this->getRequest()->getSession(); $user = $session->read('StateUser'); + $this->updateBalances($user['id']); $public_key_bin = hex2bin($user['public_hex']); $stateUserQuery = $this->StateBalances->StateUsers diff --git a/community_server/src/Controller/StateUsersController.php b/community_server/src/Controller/StateUsersController.php index 9f07fffdb..43c6664c0 100644 --- a/community_server/src/Controller/StateUsersController.php +++ b/community_server/src/Controller/StateUsersController.php @@ -69,14 +69,14 @@ class StateUsersController extends AppController $this->set(compact('stateUsers')); } - public function listIdentHashes() + /*public function listIdentHashes() { $stateUsers = $this->StateUsers->find('all')->toArray(); foreach ($stateUsers as $i => $user) { $stateUsers[$i]->identHash = TransactionCreation::DRMakeStringHash($user->email); } $this->set('stateUsers', $stateUsers); - } + }*/ public function search() { diff --git a/community_server/src/Controller/TransactionCreationsController.php b/community_server/src/Controller/TransactionCreationsController.php index af7b9a018..46a7a37f4 100644 --- a/community_server/src/Controller/TransactionCreationsController.php +++ b/community_server/src/Controller/TransactionCreationsController.php @@ -54,12 +54,12 @@ class TransactionCreationsController extends AppController ]; $transactionCreations = $this->paginate($this->TransactionCreations); $identHashes = []; - foreach ($transactionCreations as $creation) { + /*foreach ($transactionCreations as $creation) { $identHash = TransactionCreation::DRMakeStringHash($creation->state_user->email); $identHashes[$creation->state_user->id] = $identHash; - } + }*/ - $this->set(compact('transactionCreations', 'identHashes')); + //$this->set(compact('transactionCreations', 'identHashes')); } /** @@ -125,7 +125,7 @@ class TransactionCreationsController extends AppController if (count($receiverProposal) > $receiverIndex) { $pubKeyHex = $receiverProposal[$receiverIndex]['key']; - $identHash = TransactionCreation::DRMakeStringHash($receiverProposal[$receiverIndex]['email']); + //$identHash = TransactionCreation::DRMakeStringHash($receiverProposal[$receiverIndex]['email']); } $builderResult = TransactionCreation::build( $amountCent, @@ -369,7 +369,20 @@ class TransactionCreationsController extends AppController $pendings[$id] = $localAmountCent; } $pubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key)); - $identHash = TransactionCreation::DRMakeStringHash($receiverUser->email); + $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ + 'session_id' => $session->read('session_id'), + 'email' => $receiverUser->email, + 'ask' => ['user.identHash'] + ]), '/getUserInfos'); + + $identHash = 0; + if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) { + $identHash = $requestAnswear['data']['userData']['identHash']; + } else { + $this->Flash->error(__('Error by requesting LoginServer, please try again')); + } + + //$identHash = TransactionCreation::DRMakeStringHash($receiverUser->email); $localTargetDateFrozen = FrozenDate::now(); $localTargetDateFrozen = $localTargetDateFrozen ->year($localTargetDate['year']) diff --git a/community_server/src/Model/Entity/StateBalance.php b/community_server/src/Model/Entity/StateBalance.php index 871c55bd8..c5fcf5976 100644 --- a/community_server/src/Model/Entity/StateBalance.php +++ b/community_server/src/Model/Entity/StateBalance.php @@ -57,7 +57,8 @@ class StateBalance extends Entity if($decay_duration === 0) { return $this->amount; } - return $this->amount * pow(0.99999997802044727, $decay_duration); + return $this->amount; + //return $this->amount * pow(0.99999997802044727, $decay_duration); } public function partDecay($target_date) @@ -67,7 +68,8 @@ class StateBalance extends Entity if($decay_duration <= 0) { return $this->amount; } - return $this->amount * pow(0.99999997802044727, $decay_duration); + return 0; + //return $this->amount * pow(0.99999997802044727, $decay_duration); } public function decayDuration($target_date) diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php index e8c6133cb..aeac73ce8 100644 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -63,24 +63,6 @@ class TransactionCreation extends TransactionBase { return ['state' => 'success', 'transactionBody' => $transactionBody]; } - static protected function DRHashRotateLeft( $hash, $rotateBy ) - { - return ($hash<<$rotateBy)|($hash>>(32-$rotateBy)); - } - - static public function DRMakeStringHash($str) - { - $ret = 0; - - if( $str ) - { - for ($i=0; $i < strlen($str); $i++) - { - $ret = TransactionCreation::DRHashRotateLeft($ret, 7) + ord($str{$i}); - } - } - return $ret; - } public function getAmount() { return $this->protoTransactionCreation->getReceiverAmount()->getAmount(); @@ -272,7 +254,7 @@ class TransactionCreation extends TransactionBase { ->setSubject(__('Gradido Schöpfung erhalten')) ->send(); } catch(Exception $e) { - $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); +// $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; @@ -303,7 +285,7 @@ class TransactionCreation extends TransactionBase { // intval //$protoCreation->setIdentHash(intval($identHashBytes)); - $protoCreation->setIdentHash(self::DRMakeStringHash($stateUser->email)); + //$protoCreation->setIdentHash(self::DRMakeStringHash($stateUser->email)); return new TransactionCreation($protoCreation); } } diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index a509cf0f3..b9182c3ba 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -75,7 +75,8 @@ class TransactionTransfer extends TransactionBase { foreach($sigPairs as $sigPair) { //echo 'sig Pair: '; var_dump($sigPair); echo "
"; $pubkey = bin2hex($sigPair->getPubKey()); - $hash = TransactionCreation::DRMakeStringHash($pubkey); + //$hash = TransactionCreation::DRMakeStringHash($pubkey); + $hash = $pubkey; if(!isset($sigPubHexs[$hash])) { $sigPubHexs[$hash] = [$pubkey]; } else { @@ -100,7 +101,8 @@ class TransactionTransfer extends TransactionBase { return false; } // check if signature exist for sender - $hash = TransactionCreation::DRMakeStringHash($senderPublicHex); + //$hash = TransactionCreation::DRMakeStringHash($senderPublicHex); + $hash = $senderPublicHex; if(!isset($sigPubHexs[$hash]) || in_array($senderPublicHex, $sigPubHexs[$hash]) === FALSE) { $this->addError($functionName, 'missing signature for sender'); return false; @@ -253,7 +255,7 @@ class TransactionTransfer extends TransactionBase { ->setSubject(__('Gradidos erhalten')) ->send(); } catch(Exception $e) { - $this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + //$this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; diff --git a/docker-compose.override.yml b/docker-compose.override.yml index edcc364ea..1d51ce837 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,65 +1,82 @@ -version: "3.4" - -services: - ######################################################## - # FRONTEND ############################################# - ######################################################## - frontend: - image: gradido/frontend:development - build: - target: development - environment: - - NODE_ENV="development" - # - DEBUG=true - - NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/` - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - frontend_node_modules:/app/node_modules - # bind the local folder to the docker to allow live reload - - ./frontend:/app - - ######################################################### - ## LOGIN SERVER ######################################### - ######################################################### - login-server: - build: - target: login_server_debug - dockerfile: Dockerfile.debug - security_opt: - - seccomp:unconfined - cap_add: - - SYS_PTRACE - volumes: - - ./logs:/var/log/grd_login - - ./login_server/src:/code/src - - login_build:/code/build_vol - - ######################################################### - ## NGINX ################################################ - ######################################################### - nginx: - volumes: - - ./logs:/var/log/nginx - - ######################################################### - ## PHPMYADMIN ########################################### - ######################################################### - phpmyadmin: - image: phpmyadmin - container_name: phpmyadmin - environment: - - PMA_ARBITRARY=1 - #restart: always - ports: - - 8074:80 - networks: - - internal-net - - external-net - volumes: - - /sessions - -volumes: - frontend_node_modules: - login_build: - +version: "3.4" + +services: + ######################################################## + # FRONTEND ############################################# + ######################################################## + frontend: + image: gradido/frontend:development + build: + target: development + environment: + - NODE_ENV="development" + # - DEBUG=true + - NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/` + volumes: + # This makes sure the docker container has its own node modules. + # Therefore it is possible to have a different node version on the host machine + - frontend_node_modules:/app/node_modules + # bind the local folder to the docker to allow live reload + - ./frontend:/app + + ######################################################### + ## LOGIN SERVER ######################################### + ######################################################### + login-server: + build: + target: login_server_debug + dockerfile: Dockerfile.debug + security_opt: + - seccomp:unconfined + cap_add: + - SYS_PTRACE + volumes: + - ./logs:/var/log/grd_login + - conan:/root/.conan + + ######################################################### + ## NGINX ################################################ + ######################################################### + nginx: + depends_on: + - frontend + - community-server + - login-server + volumes: + - ./logs:/var/log/nginx + + ######################################################### + ## PHPMYADMIN ########################################### + ######################################################### + phpmyadmin: + image: phpmyadmin + container_name: phpmyadmin + environment: + - PMA_ARBITRARY=1 + #restart: always + ports: + - 8074:80 + networks: + - internal-net + - external-net + volumes: + - /sessions + + ######################################################### + ## skeema for updating dbs if changes happend ########### + ######################################################### + skeema: + build: + context: . + dockerfile: ./skeema/Dockerfile + target: skeema_run + container_name: skeema + depends_on: + - mariadb + networks: + - internal-net + +volumes: + frontend_node_modules: + conan: + diff --git a/docker-compose.yml b/docker-compose.yml index b0c30ca66..ad1317556 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,8 +16,6 @@ services: target: production networks: - external-net - depends_on: - - nginx ports: - 8080:8080 environment: @@ -135,4 +133,4 @@ networks: internal: true volumes: - db_vol: + db_vol: diff --git a/frontend/.env.dist b/frontend/.env.dist index bbd42d002..c8323c316 100644 --- a/frontend/.env.dist +++ b/frontend/.env.dist @@ -1,3 +1,4 @@ LOGIN_API_URL=http://localhost/login_api/ COMMUNITY_API_STATE_BALANCE_URL=http://localhost/state-balances/ -COMMUNITY_API_TRANSACTION_CREATION_URL=http://localhost/transaction-creations/ \ No newline at end of file +COMMUNITY_API_TRANSACTION_CREATION_URL=http://localhost/transaction-creations/ +VUE_PATH=/vue \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index feac8fde5..01e42e3ac 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap-vue-gradido-wallet", - "version": "0.9.3", + "version": "0.9.4", "private": true, "scripts": { "start": "node server.js", diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 956b0c03e..9f3d486c0 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -4,6 +4,12 @@ const dotenv = require('dotenv-webpack') function resolveSrc(_path) { return path.join(__dirname, _path) } + +let vue_path = process.env.VUE_PATH +if (vue_path == undefined) { + vue_path = '' +} + // vue.config.js module.exports = { pluginOptions: { @@ -15,6 +21,7 @@ module.exports = { }, }, lintOnSave: true, + publicPath: vue_path + '/', configureWebpack: { // Set up all the aliases we use in our app. resolve: { @@ -28,4 +35,5 @@ module.exports = { // Enable CSS source maps. sourceMap: process.env.NODE_ENV !== 'production', }, + outputDir: path.resolve(__dirname, './dist' + vue_path), } diff --git a/gn b/gn index a61871987..5437e2f88 160000 --- a/gn +++ b/gn @@ -1 +1 @@ -Subproject commit a61871987261614102b11ed58791081be1954d3c +Subproject commit 5437e2f882c54efe4f501f7cd0d97f53806d0b74 diff --git a/login_server/src/cpp/HTTPInterface/ElopageWebhook.cpp b/login_server/src/cpp/HTTPInterface/ElopageWebhook.cpp index c29b280a8..808695e10 100644 --- a/login_server/src/cpp/HTTPInterface/ElopageWebhook.cpp +++ b/login_server/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -11,16 +11,15 @@ using namespace Poco::Data::Keywords; #include "../SingletonManager/ConnectionManager.h" #include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/EmailManager.h" #include "../ServerConfig.h" -#include "../tasks/PrepareEmailTask.h" -#include "../tasks/SendEmailTask.h" #include "../controller/EmailVerificationCode.h" #include "../model/table/ElopageBuy.h" - +#include "../lib/DataTypeConverter.h" void ElopageWebhook::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) @@ -277,22 +276,9 @@ int HandleElopageRequestTask::run() saveElopageBuy->scheduleTask(saveElopageBuy); // check product id - Poco::UInt64 product_id = 0; - try { - product_id = stoull(mRequestData.get("product[id]", "0")); - } - catch (const std::invalid_argument& ia) { - std::cerr << __FUNCTION__ << "Invalid argument: " << ia.what() << '\n'; - } - catch (const std::out_of_range& oor) { - std::cerr << __FUNCTION__ << "Out of Range error: " << oor.what() << '\n'; - } - catch (const std::logic_error & ler) { - std::cerr << __FUNCTION__ << "Logical error: " << ler.what() << '\n'; - } - catch (...) { - std::cerr << __FUNCTION__ << "Unknown error" << '\n'; - } + unsigned long long product_id = 0; + DataTypeConverter::strToInt(mRequestData.get("product[id]", "0"), product_id); + std::string order_id = mRequestData.get("order_id", ""); auto param_error_order_id = new ParamError("HandleElopageRequestTask", "order_id", order_id.data()); @@ -380,56 +366,16 @@ int HandleElopageRequestTask::run() sendErrorsAsEmail(); return -4; } + auto em = EmailManager::getInstance(); + if (emailVerification->getModel()->insertIntoDB(false)) { + int noEMail = 0; + DataTypeConverter::strToInt(mRequestData.get("noEmail", "0"), noEMail); - // write email verification code into db - UniLib::controller::TaskPtr saveEmailVerificationCode(new model::table::ModelInsertTask(emailVerification->getModel(), true)); - saveEmailVerificationCode->scheduleTask(saveEmailVerificationCode); - int noEMail = 0; - - std::string noEmailString = mRequestData.get("noEmail", "0"); - try { - noEMail = stoi(noEmailString); - } - catch (const std::invalid_argument& ia) { - std::cerr << __FUNCTION__ << " Invalid argument: " << ia.what() << ", str: " << noEmailString << '\n'; - } - catch (const std::out_of_range& oor) { - std::cerr << __FUNCTION__ << " Out of Range error: " << oor.what() << '\n'; - } - catch (const std::logic_error & ler) { - std::cerr << __FUNCTION__ << " Logical error: " << ler.what() << '\n'; - } - catch (...) { - std::cerr << __FUNCTION__ << " Unknown error" << '\n'; + if (noEMail != 1) { + em->addEmail(new model::Email(emailVerification, newUser, model::EMAIL_USER_VERIFICATION_CODE)); + } } - if (noEMail != 1) { - - // send email to user - /*auto message = new Poco::Net::MailMessage; - - message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mEmail)); - message->setSubject("Gradido: E-Mail Verification"); - std::stringstream ss; - ss << "Hallo " << mFirstName << " " << mLastName << "," << 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/" << emailVerification->getModel()->getCode() << 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(emailVerification, newUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1)); - //sendEmail->setParentTaskPtrInArray(prepareEmail, 0); - sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 0); - sendEmail->scheduleTask(sendEmail); - } } // if errors occured, send via email diff --git a/login_server/src/cpp/model/Session.cpp b/login_server/src/cpp/model/Session.cpp index 86fad389c..dcad0d40a 100644 --- a/login_server/src/cpp/model/Session.cpp +++ b/login_server/src/cpp/model/Session.cpp @@ -12,8 +12,6 @@ #include "../SingletonManager/EmailManager.h" #include "../SingletonManager/SingletonTaskObserver.h" -#include "../tasks/PrepareEmailTask.h" -#include "../tasks/SendEmailTask.h" #include "../tasks/SigningTransaction.h" #include "../tasks/AuthenticatedEncryptionCreateKeyTask.h" #include "../tasks/VerificationEmailResendTask.h" @@ -348,12 +346,14 @@ bool Session::createUser(const std::string& first_name, const std::string& last_ */ //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)); + auto em = EmailManager::getInstance(); + em->addEmail(new model::Email(mEmailVerificationCodeObject, mNewUser, model::EMAIL_USER_VERIFICATION_CODE)); + /*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 diff --git a/login_server/src/cpp/tasks/PrepareEmailTask.cpp b/login_server/src/cpp/tasks/PrepareEmailTask.cpp deleted file mode 100644 index cc20d9472..000000000 --- a/login_server/src/cpp/tasks/PrepareEmailTask.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "PrepareEmailTask.h" -#include "../lib/Profiler.h" -#include "../ServerConfig.h" -#include "../SingletonManager/ErrorManager.h" - -#include "Poco/Net/SSLException.h" - -PrepareEmailTask::PrepareEmailTask(UniLib::controller::CPUSheduler* cpuScheduler) - : UniLib::controller::CPUTask(cpuScheduler), mMailClientSession(nullptr) -{ - -} - -PrepareEmailTask::~PrepareEmailTask() -{ - if (mMailClientSession) { - delete mMailClientSession; - } -} - -int PrepareEmailTask::run() -{ - if (ServerConfig::g_disableEmail) return 0; - Profiler timeUsed; - mMailClientSession = new Poco::Net::SecureSMTPClientSession(ServerConfig::g_EmailAccount.url, ServerConfig::g_EmailAccount.port); - mMailClientSession->login(); - try { - mMailClientSession->startTLS(ServerConfig::g_SSL_CLient_Context); - mMailClientSession->login(Poco::Net::SMTPClientSession::AUTH_LOGIN, ServerConfig::g_EmailAccount.username, ServerConfig::g_EmailAccount.password); - } catch(Poco::Net::SSLException& ex) { - printf("[PrepareEmailTask] ssl certificate error: %s\nPlease make sure you have cacert.pem (CA/root certificates) next to binary from https://curl.haxx.se/docs/caextract.html\n", ex.displayText().data()); - return -1; - } - - //printf("[PrepareEmailTask] time: %s\n", timeUsed.string().data()); - /* - session.login(); - session.startTLS(pContext); - if (!username.empty()) - { - session.login(SMTPClientSession::AUTH_LOGIN, username, password); - } - session.sendMessage(message); - session.close(); - */ - - return 0; -} - -int PrepareEmailTask::send(Poco::Net::MailMessage* message) -{ - if (ServerConfig::g_disableEmail) return 0; - - auto er = ErrorManager::getInstance(); - try { - mMailClientSession->sendMessage(*message); - mMailClientSession->close(); - } - catch (Poco::Exception& exc) { - er->addError(new ParamError("PrepareEmailTask::send", "error sending email", exc.displayText().data())); - printf("[PrepareEmailTask::%s] error sending email: %s\n", __FUNCTION__, exc.displayText().data()); - return -1; - } - return 0; -} \ No newline at end of file diff --git a/login_server/src/cpp/tasks/PrepareEmailTask.h b/login_server/src/cpp/tasks/PrepareEmailTask.h deleted file mode 100644 index 4036eefc2..000000000 --- a/login_server/src/cpp/tasks/PrepareEmailTask.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GRADIDO_LOGIN_SERVER_TASKS_PREPAIRE_EMAIL_TASK_INCLUDE -#define GRADIDO_LOGIN_SERVER_TASKS_PREPAIRE_EMAIL_TASK_INCLUDE - -#include "CPUTask.h" -#include "Poco/Net/SecureSMTPClientSession.h" - - - -class PrepareEmailTask : public UniLib::controller::CPUTask -{ -public: - PrepareEmailTask(UniLib::controller::CPUSheduler* cpuScheduler); - virtual ~PrepareEmailTask(); - - virtual int run(); - int send(Poco::Net::MailMessage* message); - virtual const char* getResourceType() const { return "PrepareEmailTask"; }; -protected: - -private: - Poco::Net::SecureSMTPClientSession* mMailClientSession; -}; - - -#endif //GRADIDO_LOGIN_SERVER_TASKS_PREPAIRE_EMAIL_TASK_INCLUDE \ No newline at end of file diff --git a/login_server/src/cpp/tasks/SendEmailTask.cpp b/login_server/src/cpp/tasks/SendEmailTask.cpp deleted file mode 100644 index e3a5e0069..000000000 --- a/login_server/src/cpp/tasks/SendEmailTask.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "SendEmailTask.h" -#include "PrepareEmailTask.h" -#include "../lib/Profiler.h" -#include "../SingletonManager/ErrorManager.h" -#include "../SingletonManager/EmailManager.h" -#include "../ServerConfig.h" - -#include "Poco/Net/MediaType.h" - -SendEmailTask::SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/) - : UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount+1), mMailMessage(mailMessage), mEmail(nullptr) -{ -} - -SendEmailTask::SendEmailTask(model::Email*email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/) - : UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount), mMailMessage(nullptr), mEmail(email) -{ - -} - -SendEmailTask::~SendEmailTask() -{ - if (mMailMessage) { - delete mMailMessage; - mMailMessage = nullptr; - } - if (mEmail) { - delete mEmail; - mEmail = nullptr; - } - -} - -int SendEmailTask::run() -{ - if(ServerConfig::g_disableEmail) return 0; - - Profiler timeUsed; - auto er = ErrorManager::getInstance(); - auto parent = getParent(0); - - if (mMailMessage) { - - if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) { - er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask")); - er->sendErrorsAsEmail(); - return -1; - } - PrepareEmailTask* prepare = (PrepareEmailTask*)&(*parent); - mMailMessage->setSender(ServerConfig::g_EmailAccount.sender); - - if (prepare->send(mMailMessage)) { - er->sendErrorsAsEmail(); - return -1; - } - } - else if (mEmail) { - auto em = EmailManager::getInstance(); - em->addEmail(mEmail); - mEmail = nullptr; - } - //printf("[SendEmailTask] time: %s\n", timeUsed.string().data()); - return 0; -} \ No newline at end of file diff --git a/login_server/src/cpp/tasks/SendEmailTask.h b/login_server/src/cpp/tasks/SendEmailTask.h deleted file mode 100644 index 86e4b76dc..000000000 --- a/login_server/src/cpp/tasks/SendEmailTask.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef GRADIDO_LOGIN_SERVER_TASKS_SEND_EMAIL_TASK_INCLUDE -#define GRADIDO_LOGIN_SERVER_TASKS_SEND_EMAIL_TASK_INCLUDE - -#include "CPUTask.h" -#include "Poco/Net/MailMessage.h" - -#include "../model/email/Email.h" - -/* - * @author: Dario Rekowski - * - * @date: 29.09.19 - * @desc: Task for send an email, the first parent dependence pointer must be a prepare email task -*/ - - -class SendEmailTask : public UniLib::controller::CPUTask -{ -public: - - SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0); - SendEmailTask(model::Email* email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0); - virtual ~SendEmailTask(); - - virtual int run(); - - virtual const char* getResourceType() const { return "SendEmailTask"; }; -protected: - -private: - Poco::Net::MailMessage* mMailMessage; - model::Email* mEmail; -}; - - -#endif //GRADIDO_LOGIN_SERVER_TASKS_SEND_EMAIL_TASK_INCLUDE \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 064395336..cdc418d05 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -12,15 +12,6 @@ server { root /var/www/cakephp/webroot; index index.php; - - location ~* \.(png|jpg|ico|webp)$ { - expires 30d; - } - - location ~* \.(js|css) { - # expires 1d; - expires 1d; - } location ~ \.php$ { fastcgi_pass community-server:9000; @@ -67,9 +58,33 @@ server { proxy_pass http://login-server:1201; proxy_redirect off; } + + location /vue { + + + location /vue/sockjs-node { + rewrite /vue/(.*) /$1; + } + location ~* \.(png) { + expires 1d; + rewrite /vue/(.*) /$1; + } + + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + #rewrite /vue/(.*) /$1 break; + + proxy_pass http://frontend:8080; + proxy_redirect off; + } location / { - try_files $uri $uri/ /index.php?$args; + try_files $uri $uri/ /index.php?$args; } # access_log /var/log/nginx/access.log main; diff --git a/package.json b/package.json index be933d261..593a21754 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gradido", - "version": "0.9.3", + "version": "0.9.4", "description": "Gradido", "main": "index.js", "repository": "git@github.com:gradido/gradido.git",