diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 92ac77d86..104b85502 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,19 +44,19 @@ jobs: - name: Checkout code uses: actions/checkout@v2 with: - submodules: recursive + submodules: true ########################################################################## # BUILD LOGIN SERVER DOCKER IMAGE ######################################## ########################################################################## - - name: login server | Build `test` image + - name: login server | Build `release` image run: | - docker build --target login_server -t "gradido/login_server:test" -f ./login_server/Dockerfile login_server/ - docker save "gradido/login_server:test" > /tmp/login_server.tar - - name: Upload Artifact - uses: actions/upload-artifact@v2 - with: - name: docker-login-server-test - path: /tmp/login_server.tar + docker build --target release -t "gradido/login_server:release" -f ./login_server/Dockerfile login_server/ + #docker save "gradido/login_server:test" > /tmp/login_server.tar + #- name: Upload Artifact + # uses: actions/upload-artifact@v2 + #with: + # name: docker-login-server-test + #path: /tmp/login_server.tar ############################################################################## # JOB: DOCKER BUILD TEST COMMUNITY SERVER #################################### @@ -102,7 +102,7 @@ jobs: ########################################################################## - name: mariadb | Build `test` image run: | - docker build -t "gradido/mariadb:test" -f ./mariadb/Dockerfile ./ + docker build --target mariadb_server_test -t "gradido/mariadb:test" -f ./mariadb/Dockerfile ./ docker save "gradido/mariadb:test" > /tmp/mariadb.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -212,9 +212,138 @@ jobs: report_name: Coverage Frontend type: lcov result_path: ./coverage/lcov.info - min_coverage: 20 + min_coverage: 21 token: ${{ github.token }} + ############################################################################## + # JOB: UNIT TEST LOGIN-SERVER ############################################### + ############################################################################## + unit_test_login_server: + name: Unit tests - Login-Server + runs-on: ubuntu-latest + needs: [] + services: + mariadb: + image: gradido/mariadb:test + env: + MARIADB_ALLOW_EMPTY_PASSWORD: 1 + MARIADB_USER: root + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" + --health-interval=6s + --health-timeout=3s + --health-retries=4 + steps: + - name: Debug service + run: echo "$(docker ps)" + - name: Debug container choosing script + run: echo "$(docker container ls | grep mariadb | awk '{ print $1 }')" + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + with: + submodules: true + ########################################################################## + # Build Login-Server Test Docker image ################################### + ########################################################################## + - name: login server | Build `test` image + run: | + docker build --target test -t "gradido/login_server:test" -f ./login_server/Dockerfile login_server/ + ########################################################################## + # UNIT TESTS BACKEND LOGIN-SERVER ####################################### + ########################################################################## + - name: Login-Server | Unit tests + run: | + docker run --network container:$(docker container ls | grep mariadb | awk '{ print $1 }') -v ~/coverage:/code/build_cov/coverage -v $(pwd)/configs/login_server:/etc/grd_login gradido/login_server:test + cp -r ~/coverage ./coverage + ########################################################################## + # COVERAGE CHECK BACKEND LOGIN-SERVER #################################### + ########################################################################## + - name: backend login | Coverage check + uses: webcraftmedia/coverage-check-action@master + with: + report_name: Coverage Backend + type: lcov + result_path: ./coverage/coverage.info + min_coverage: 6 + token: ${{ github.token }} + + ############################################################################## + # JOB: UNIT TEST COMMUNITY-SERVER ########################################### + ############################################################################## + unit_test_community_server: + name: Unit tests - Community Server + runs-on: ubuntu-latest + needs: [build_test_community_server] + services: + mariadb: + image: gradido/mariadb:test + env: + MARIADB_ALLOW_EMPTY_PASSWORD: 1 + MARIADB_USER: root + # ports: + # - 3306:3306 + options: --health-cmd="mysqladmin ping" + --health-interval=5s + --health-timeout=5s + --health-retries=3 + steps: + - name: get mariadb container id + run: echo "::set-output name=id::$(docker container ls | grep mariadb | awk '{ print $1 }')" + id: mariadb_container + - name: show networks + run: echo "$(docker network ls)" + - name: get automatic created network + run: echo "::set-output name=id::$(docker network ls | grep github_network | awk '{ print $1 }')" + id: network + - name: Start Login-Server + run: docker run --network ${{ steps.network.outputs.id }} --name=login-server -d gradido/login_server:default + - name: get login-server container id + run: echo "::set-output name=id::$(docker container ls | grep login_server | awk '{ print $1 }')" + id: login_server_container + ########################################################################## + # CHECKOUT CODE ########################################################## + ########################################################################## + - name: Checkout code + uses: actions/checkout@v2 + ########################################################################## + # DOWNLOAD DOCKER IMAGE ################################################## + ########################################################################## + - name: Download Docker Image (Community-Server) + uses: actions/download-artifact@v2 + with: + name: docker-community-server-test + path: /tmp + - name: Load Docker Image + run: docker load < /tmp/community_server.tar + + # for debugging login-server + - name: check login-server + run: docker logs ${{ steps.login_server_container.outputs.id }} + - name: check mariadb + run: docker logs ${{ steps.mariadb_container.outputs.id }} + ########################################################################## + # UNIT TESTS BACKEND COMMUNITY-SERVER ####################################### + ########################################################################## + - name: community server | Unit tests + run: | + docker run --network ${{ steps.network.outputs.id }} -v ~/coverage:/var/www/cakephp/webroot/coverage gradido/community_server:test + cp -r ~/coverage ./coverage + ######################################################################### + # COVERAGE CHECK BACKEND COMMUNITY-SERVER #################################### + ########################################################################## + #- name: backend community simplecov | Coverage check + # uses: webcraftmedia/coverage-check-action@master + # with: + # report_name: Coverage Backend + # type: simplecov + # result_path: ./coverage/coverage.info + # min_coverage: 8 + # token: ${{ github.token }} + #test: # runs-on: ubuntu-latest # steps: @@ -228,4 +357,4 @@ jobs: # GN_INSTANCE_FOLDER: /tmp/gradio-node-instance # GN_CONTAINER_NAME: gradido-node-build # run: docker run gradido-node-test - # timeout-minutes: 2 \ No newline at end of file + # timeout-minutes: 2 diff --git a/community_server/Dockerfile b/community_server/Dockerfile index 8129d581d..eabb37741 100644 --- a/community_server/Dockerfile +++ b/community_server/Dockerfile @@ -1,8 +1,8 @@ -FROM phpdockerio/php74-fpm +FROM phpdockerio/php74-fpm as community_server # install php fpm RUN apt-get update \ - && apt-get -y --no-install-recommends install curl unzip php7.4-curl php7.4-fpm php7.4-mbstring php7.4-intl php7.4-xml php7.4-pdo php7.4-mysql \ + && apt-get -y --no-install-recommends install curl unzip php7.4-curl php7.4-fpm php7.4-mbstring php7.4-intl php7.4-xml php7.4-pdo php7.4-mysql php7.4-xdebug \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* WORKDIR /var/www/cakephp @@ -13,5 +13,17 @@ COPY ./configs/community_server/app.php ./config/ RUN composer update RUN composer dump-autoload +######### special for code coverage and testing +FROM community_server as test + + +RUN apt-get update \ + && apt-get -y --no-install-recommends install php7.4-xdebug \ + && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* + +WORKDIR /var/www/cakephp +ENV XDEBUG_MODE=coverage + +CMD ./vendor/bin/phpunit --coverage-text=./webroot/coverage/coverage.info diff --git a/community_server/config/routes.php b/community_server/config/routes.php index 3b0dfedc1..20fc1ff62 100644 --- a/community_server/config/routes.php +++ b/community_server/config/routes.php @@ -60,19 +60,21 @@ Router::scope('/', function (RouteBuilder $routes) { $whitelist = ['JsonRequestHandler', 'ElopageWebhook', 'AppRequests']; $ajaxWhitelist = ['TransactionSendCoins', 'TransactionCreations']; + $callerIp = $request->clientIp(); + foreach($whitelist as $entry) { if($request->getParam('controller') === $entry) { if($entry == 'ElopageWebhook' || $entry == 'AppRequests') { return true; } $allowedIpLocalhost = ['127.0.0.1', 'localhost', '', '::1']; - if(in_array($clientIp, $allowedIpLocalhost)) { + if(in_array($callerIp, $allowedIpLocalhost)) { return true; } $allowedCaller = Configure::read('API.allowedCaller'); $ipPerHost = []; if($allowedCaller && count($allowedCaller) > 0) { - $callerIp = $request->clientIp(); + foreach($allowedCaller as $allowed) { $ip = gethostbyname($allowed); $ipPerHost[$allowed] = $ip; diff --git a/community_server/src/Controller/AppController.php b/community_server/src/Controller/AppController.php index a1416678f..eb11299ce 100644 --- a/community_server/src/Controller/AppController.php +++ b/community_server/src/Controller/AppController.php @@ -88,19 +88,8 @@ class AppController extends Controller // load current balance $session = $this->getRequest()->getSession(); $state_user_id = $session->read('StateUser.id'); - if ($state_user_id) { - $stateBalancesTable = TableRegistry::getTableLocator()->get('stateBalances'); - $stateBalanceQuery = $stateBalancesTable - ->find('all') - ->contain(false) - ->where(['state_user_id' => $state_user_id]); - if ($stateBalanceQuery->count() == 1) { - //var_dump($stateBalanceEntry->first()); - $session->write('StateUser.balance', $stateBalanceQuery->first()->decay); - //echo "stateUser.balance: " . $session->read('StateUser.balance'); - } - } - + + // load error count if ($state_user_id) { $stateErrorsTable = TableRegistry::getTableLocator()->get('stateErrors'); @@ -111,8 +100,6 @@ class AppController extends Controller ->where(['state_user_id' => $state_user_id]); $session->write('StateUser.errorCount', $stateErrorQuery->count()); } - //echo "initialize"; - // put current page into global for navi $GLOBALS["passed"] = null; diff --git a/community_server/src/Controller/AppRequestsController.php b/community_server/src/Controller/AppRequestsController.php index 4d70a68b1..6b744ff69 100644 --- a/community_server/src/Controller/AppRequestsController.php +++ b/community_server/src/Controller/AppRequestsController.php @@ -276,7 +276,8 @@ class AppRequestsController extends AppController $this->viewBuilder()->setLayout('ajax'); $login_result = $this->requestLogin($session_id, false); if($login_result !== true) { - return $this->returnJson($login_result); + $this->set('body', $login_result); + return; } $session = $this->getRequest()->getSession(); $user = $session->read('StateUser'); @@ -285,16 +286,24 @@ class AppRequestsController extends AppController $state_balance = $state_balances_table->find()->where(['state_user_id' => $user['id']])->first(); - if(!$state_balance) { - return $this->returnJson(['state' => 'success', 'balance' => 0]); - } + $now = new FrozenTime(); - $body = [ - 'state' => 'success', - 'balance' => $state_balance->amount, - 'decay' => $state_balance->partDecay($now), - 'decay_date' => $now - ]; + if(!$state_balance) { + $body = [ + 'state' => 'success', + 'balance' => 0, + 'decay' => 0 + ]; + } else { + + $body = [ + 'state' => 'success', + 'balance' => $state_balance->amount, + 'decay' => $state_balance->partDecay($now), + ]; + } + + $body['decay_date'] = $now; $this->set('body', $body); } @@ -302,35 +311,31 @@ class AppRequestsController extends AppController { $this->viewBuilder()->setLayout('ajax'); $startTime = microtime(true); + $login_result = $this->requestLogin($session_id, false); + if($login_result !== true) { return $this->returnJson($login_result); } $session = $this->getRequest()->getSession(); $user = $session->read('StateUser'); - - + $stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances'); $stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions'); $transactionsTable = TableRegistry::getTableLocator()->get('Transactions'); - $stateBalancesTable->updateBalances($user['id']); - + $gdtSum = 0; + $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi'); - + if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) { $gdtSum = intval($gdtEntries['data']['sum']); } else { $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id'] ? $user['id'] : 0); } - $stateUserTransactions_total = $stateUserTransactionsTable - ->find() - ->select(['id']) - ->where(['state_user_id' => $user['id']]) - ->contain([]); $stateUserTransactionsQuery = $stateUserTransactionsTable ->find() @@ -343,17 +348,18 @@ class AppRequestsController extends AppController $decay = true; $transactions = []; $transactions_from_db = $stateUserTransactionsQuery->toArray(); - if($stateUserTransactionsQuery->count() > 0) { + + if(count($transactions_from_db)) { if($orderDirection == 'DESC') { $transactions_from_db = array_reverse($transactions_from_db); } + $transactions = $transactionsTable->listTransactionsHumanReadable($transactions_from_db, $user, $decay); if($orderDirection == 'DESC') { $transactions = array_reverse($transactions); } - - } + } $state_balance = $stateBalancesTable->find()->where(['state_user_id' => $user['id']])->first(); @@ -361,7 +367,7 @@ class AppRequestsController extends AppController 'state' => 'success', 'transactions' => $transactions, 'transactionExecutingCount' => $session->read('Transactions.executing'), - 'count' => $stateUserTransactions_total->count(), + 'count' => $stateUserTransactionsQuery->count(), 'gdtSum' => $gdtSum, 'timeUsed' => microtime(true) - $startTime ]; @@ -375,8 +381,8 @@ class AppRequestsController extends AppController $body['balance'] = $state_balance->amount; $body['decay'] = $stateBalancesTable->calculateDecay($state_balance->amount, $state_balance->record_date, $now); } - - $this->set('body', $body); + + $this->set('body', $body); } private function acquireAccessToken($session_id) diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php index 12e03be8d..611984118 100644 --- a/community_server/src/Controller/JsonRequestHandlerController.php +++ b/community_server/src/Controller/JsonRequestHandlerController.php @@ -340,12 +340,13 @@ class JsonRequestHandlerController extends AppController { return; } $transaction_body = $transaction->getTransactionBody(); - $transaction_type_name = $transaction_body->getTransactionTypeName(); - $senderUser = null; - if($transaction_type_name === 'transfer') { - $senderUser = $transaction_body->getSpecificTransaction()->getSenderUser(); - } else if($transaction_type_name === 'creation') { - $senderUser = $transaction->getFirstSigningUser(); + $senderUser = $transaction->getFirstSigningUser(); + if($transaction_body != null) { + $transaction_type_name = $transaction_body->getTransactionTypeName(); + + if($transaction_type_name === 'transfer') { + $senderUser = $transaction_body->getSpecificTransaction()->getSenderUser(); + } } // send notification email $noReplyEmail = Configure::read('noReplyEmail'); @@ -373,22 +374,29 @@ class JsonRequestHandlerController extends AppController { private function putTransaction($transactionBase64) { $transaction = new Transaction($transactionBase64); - //echo "after new transaction
"; + if($transaction->hasErrors()) { $this->sendEMailTransactionFailed($transaction, 'parse'); return $this->returnJson(['state' => 'error', 'msg' => 'error parsing transaction', 'details' => $transaction->getErrors()]); } - //echo "after check on errors
"; + if(!$transaction->validate()) { //$transaction_details $this->sendEMailTransactionFailed($transaction, 'validate'); - return $this->returnJsonSaveError($transaction, ['state' => 'error', 'msg' => 'error validate transaction', 'details' => $transaction->getErrors()]); + return $this->returnJsonSaveError($transaction, [ + 'state' => 'error', + 'msg' => 'error validate transaction', + 'details' => $transaction->getErrors() + ]); } - //echo "after validate
"; if ($transaction->save()) { + $result = ['state' => 'success']; + if($transaction->hasWarnings()) { + $result['warnings'] = $transaction->getWarnings(); + } // success - return $this->returnJson(['state' => 'success']); + return $this->returnJson($result); } else { $this->sendEMailTransactionFailed($transaction, 'save'); diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php index 0dc9b672d..f16ed407b 100644 --- a/community_server/src/Controller/StateBalancesController.php +++ b/community_server/src/Controller/StateBalancesController.php @@ -151,35 +151,6 @@ class StateBalancesController extends AppController $this->set('gdtSum', $gdtSum); } - public function ajaxGetBalance($session_id = 0) - { - if(!$session_id) { - return $this->returnJson(['state' => 'error', 'msg' => 'invalid session id']); - } - $login_result = $this->requestLogin($session_id, false); - if($login_result !== true) { - return $this->returnJson($login_result); - } - $session = $this->getRequest()->getSession(); - $user = $session->read('StateUser'); - - $this->StateBalances->updateBalances($user['id']); - - $state_balance = $this->StateBalances->find()->where(['state_user_id' => $user['id']])->first(); - - if(!$state_balance) { - return $this->returnJson(['state' => 'success', 'balance' => 0]); - } - $now = new FrozenTime(); - - return $this->returnJson([ - 'state' => 'success', - 'balance' => $state_balance->amount, - 'decay' => $this->StateBalances->calculateDecay($state_balance->amount, $state_balance->record_date, $now), - 'decay_date' => $now - ]); - } - public function ajaxGdtOverview() { diff --git a/community_server/src/Controller/TransactionsController.php b/community_server/src/Controller/TransactionsController.php index 90e78b7fb..67526dfcc 100644 --- a/community_server/src/Controller/TransactionsController.php +++ b/community_server/src/Controller/TransactionsController.php @@ -7,6 +7,7 @@ use Model\Transactions\Transaction; use Model\Transactions\TransactionBody; use Cake\Core\Configure; +use Cake\I18n\Time; use Cake\ORM\TableRegistry; /** @@ -24,7 +25,7 @@ class TransactionsController extends AppController parent::initialize(); $this->loadComponent('GradidoNumber'); $this->loadComponent('JsonRpcRequestClient'); - $this->Auth->allow(['decode']); + $this->Auth->allow(['decode', 'manualTransaction']); } /** @@ -170,6 +171,78 @@ class TransactionsController extends AppController $this->set('transaction', $transaction); } + public function manualTransaction() + { + if ($this->request->is('post')) { + $data = $this->request->getData(); + $type = $data['type']; + + $transaction = new \Proto\Gradido\GradidoTransaction(); + $transactionBody = new \Proto\Gradido\TransactionBody(); + $transactionBody->setMemo($data['memo']); + $created = new \Proto\Gradido\TimestampSeconds(); + $now = new Time(); + $created->setSeconds($now->getTimestamp()); + $transactionBody->setCreated($created); + if($type == "creation") { + $creation = new \Proto\Gradido\GradidoCreation(); + $target_date = new \Proto\Gradido\TimestampSeconds(); + $target_time = new Time($data['target_date']); + $target_date->setSeconds($target_time->getTimestamp()); + $creation->setTargetDate($target_date); + $receiver = new \Proto\Gradido\TransferAmount(); + $receiver->setAmount(intval($data['amount'])); + $receiver->setPubkey(hex2bin($data['target_public_key'])); + $creation->setReceiver($receiver); + $transactionBody->setCreation($creation); + } else if($type == "transfer") { + $transfer = new \Proto\Gradido\GradidoTransfer(); + $local_transfer = new \Proto\Gradido\LocalTransfer(); + $sender = new \Proto\Gradido\TransferAmount(); + $sender->setAmount(intval($data['amount'])); + $sender->setPubkey(hex2bin($data['sender_public_key'])); + $local_transfer->setSender($sender); + $local_transfer->setReceiver(hex2bin($data['receiver_public_key'])); + $transfer->setLocal($local_transfer); + $transactionBody->setTransfer($transfer); + } + $body_bytes = $transactionBody->serializeToString(); + $transaction->setBodyBytes($body_bytes); + + $protoSigMap = new \Proto\Gradido\SignatureMap(); + $sigPairs = $protoSigMap->getSigPair(); + //echo "sigPairs: "; var_dump($sigPairs); echo "
"; + //return null; + + // sign with keys + //foreach($keys as $key) { + $sigPair = new \Proto\Gradido\SignaturePair(); + $sigPair->setPubKey(hex2bin($data['signer_public_key'])); + + $signature = sodium_crypto_sign_detached($body_bytes, hex2bin($data['signer_private_key'])); + echo "signature: " . bin2hex($signature). "
"; + $sigPair->setEd25519($signature); + + $sigPairs[] = $sigPair; + // SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING + // SODIUM_BASE64_VARIANT_ORIGINAL + $transaction->setSigMap($protoSigMap); + //var_dump($protoSigMap); + $transaction_bin = $transaction->serializeToString(); +// $url_safe = sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL); + $base64 = [ + //'original' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL), + //'original_nopadding' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_ORIGINAL_NO_PADDING), + //'urlsafe' => sodium_bin2base64($transaction_bin, sodium_base64_VARIANT_URLSAFE), + 'urlsafe_nopadding' => sodium_bin2base64($transaction_bin, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING), + 'php' => base64_encode($transaction_bin) + + ]; + + $this->set('base64', $base64); + } + } + public function decode() { $this->viewBuilder()->setLayout('frontend'); diff --git a/community_server/src/Model/Messages/Gradido/Key.php b/community_server/src/Model/Messages/Gradido/Key.php deleted file mode 100644 index b6190304c..000000000 --- a/community_server/src/Model/Messages/Gradido/Key.php +++ /dev/null @@ -1,96 +0,0 @@ -model.messages.gradido.Key - */ -class Key extends \Google\Protobuf\Internal\Message -{ - protected $key; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $ed25519 - * ed25519 signature (libsodium default) - * @type string $ed25519_ref10 - * ed25519 ref10 signature - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @return string - */ - public function getEd25519() - { - return $this->readOneof(2); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @param string $var - * @return $this - */ - public function setEd25519($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @return string - */ - public function getEd25519Ref10() - { - return $this->readOneof(3); - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @param string $var - * @return $this - */ - public function setEd25519Ref10($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getKey() - { - return $this->whichOneof("key"); - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/ReceiverAmount.php b/community_server/src/Model/Messages/Gradido/ReceiverAmount.php deleted file mode 100644 index 240c5a6fe..000000000 --- a/community_server/src/Model/Messages/Gradido/ReceiverAmount.php +++ /dev/null @@ -1,85 +0,0 @@ -model.messages.gradido.ReceiverAmount - */ -class ReceiverAmount extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; - */ - private $ed25519_receiver_pubkey = ''; - /** - * Generated from protobuf field sint64 amount = 2; - */ - private $amount = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $ed25519_receiver_pubkey - * @type int|string $amount - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; - * @return string - */ - public function getEd25519ReceiverPubkey() - { - return $this->ed25519_receiver_pubkey; - } - - /** - * Generated from protobuf field bytes ed25519_receiver_pubkey = 1; - * @param string $var - * @return $this - */ - public function setEd25519ReceiverPubkey($var) - { - GPBUtil::checkString($var, False); - $this->ed25519_receiver_pubkey = $var; - - return $this; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @return int|string - */ - public function getAmount() - { - return $this->amount; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @param int|string $var - * @return $this - */ - public function setAmount($var) - { - GPBUtil::checkInt64($var); - $this->amount = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/SenderAmount.php b/community_server/src/Model/Messages/Gradido/SenderAmount.php deleted file mode 100644 index 52a41f71f..000000000 --- a/community_server/src/Model/Messages/Gradido/SenderAmount.php +++ /dev/null @@ -1,119 +0,0 @@ -model.messages.gradido.SenderAmount - */ -class SenderAmount extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes ed25519_sender_pubkey = 1; - */ - private $ed25519_sender_pubkey = ''; - /** - * Generated from protobuf field sint64 amount = 2; - */ - private $amount = 0; - /** - * sender balance after transaction, including perishability - * - * Generated from protobuf field sint64 senderFinalBalance = 3; - */ - private $senderFinalBalance = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $ed25519_sender_pubkey - * @type int|string $amount - * @type int|string $senderFinalBalance - * sender balance after transaction, including perishability - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes ed25519_sender_pubkey = 1; - * @return string - */ - public function getEd25519SenderPubkey() - { - return $this->ed25519_sender_pubkey; - } - - /** - * Generated from protobuf field bytes ed25519_sender_pubkey = 1; - * @param string $var - * @return $this - */ - public function setEd25519SenderPubkey($var) - { - GPBUtil::checkString($var, False); - $this->ed25519_sender_pubkey = $var; - - return $this; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @return int|string - */ - public function getAmount() - { - return $this->amount; - } - - /** - * Generated from protobuf field sint64 amount = 2; - * @param int|string $var - * @return $this - */ - public function setAmount($var) - { - GPBUtil::checkInt64($var); - $this->amount = $var; - - return $this; - } - - /** - * sender balance after transaction, including perishability - * - * Generated from protobuf field sint64 senderFinalBalance = 3; - * @return int|string - */ - public function getSenderFinalBalance() - { - return $this->senderFinalBalance; - } - - /** - * sender balance after transaction, including perishability - * - * Generated from protobuf field sint64 senderFinalBalance = 3; - * @param int|string $var - * @return $this - */ - public function setSenderFinalBalance($var) - { - GPBUtil::checkInt64($var); - $this->senderFinalBalance = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/SignatureMap.php b/community_server/src/Model/Messages/Gradido/SignatureMap.php deleted file mode 100644 index 228282747..000000000 --- a/community_server/src/Model/Messages/Gradido/SignatureMap.php +++ /dev/null @@ -1,65 +0,0 @@ -model.messages.gradido.SignatureMap - */ -class SignatureMap extends \Google\Protobuf\Internal\Message -{ - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; - */ - private $sigPair; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $sigPair - * Each signature pair corresponds to a unique Key required to sign the transaction. - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; - * @return \Google\Protobuf\Internal\RepeatedField - */ - public function getSigPair() - { - return $this->sigPair; - } - - /** - * Each signature pair corresponds to a unique Key required to sign the transaction. - * - * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1; - * @param \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $var - * @return $this - */ - public function setSigPair($var) - { - $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SignaturePair::class); - $this->sigPair = $arr; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/SignaturePair.php b/community_server/src/Model/Messages/Gradido/SignaturePair.php deleted file mode 100644 index 203eb5677..000000000 --- a/community_server/src/Model/Messages/Gradido/SignaturePair.php +++ /dev/null @@ -1,123 +0,0 @@ -model.messages.gradido.SignaturePair - */ -class SignaturePair extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field bytes pubKey = 1; - */ - private $pubKey = ''; - protected $signature; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $pubKey - * @type string $ed25519 - * ed25519 signature (libsodium default) - * @type string $ed25519_ref10 - * ed25519 ref10 signature - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field bytes pubKey = 1; - * @return string - */ - public function getPubKey() - { - return $this->pubKey; - } - - /** - * Generated from protobuf field bytes pubKey = 1; - * @param string $var - * @return $this - */ - public function setPubKey($var) - { - GPBUtil::checkString($var, False); - $this->pubKey = $var; - - return $this; - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @return string - */ - public function getEd25519() - { - return $this->readOneof(2); - } - - /** - * ed25519 signature (libsodium default) - * - * Generated from protobuf field bytes ed25519 = 2; - * @param string $var - * @return $this - */ - public function setEd25519($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @return string - */ - public function getEd25519Ref10() - { - return $this->readOneof(3); - } - - /** - * ed25519 ref10 signature - * - * Generated from protobuf field bytes ed25519_ref10 = 3; - * @param string $var - * @return $this - */ - public function setEd25519Ref10($var) - { - GPBUtil::checkString($var, False); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * @return string - */ - public function getSignature() - { - return $this->whichOneof("signature"); - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/StateCreateGroup.php b/community_server/src/Model/Messages/Gradido/StateCreateGroup.php deleted file mode 100644 index 4273ef93d..000000000 --- a/community_server/src/Model/Messages/Gradido/StateCreateGroup.php +++ /dev/null @@ -1,114 +0,0 @@ -model.messages.gradido.StateCreateGroup - */ -class StateCreateGroup extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field string name = 1; - */ - private $name = ''; - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; - */ - private $groupPublicKey = null; - /** - * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; - */ - private $parentGroupPublicKey = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $name - * @type \Model\Messages\Gradido\Key $groupPublicKey - * @type \Model\Messages\Gradido\Key $parentGroupPublicKey - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\StateCreateGroup::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field string name = 1; - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Generated from protobuf field string name = 1; - * @param string $var - * @return $this - */ - public function setName($var) - { - GPBUtil::checkString($var, True); - $this->name = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; - * @return \Model\Messages\Gradido\Key - */ - public function getGroupPublicKey() - { - return $this->groupPublicKey; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2; - * @param \Model\Messages\Gradido\Key $var - * @return $this - */ - public function setGroupPublicKey($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); - $this->groupPublicKey = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; - * @return \Model\Messages\Gradido\Key - */ - public function getParentGroupPublicKey() - { - return $this->parentGroupPublicKey; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3; - * @param \Model\Messages\Gradido\Key $var - * @return $this - */ - public function setParentGroupPublicKey($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); - $this->parentGroupPublicKey = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php b/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php deleted file mode 100644 index c5371d76c..000000000 --- a/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php +++ /dev/null @@ -1,114 +0,0 @@ -model.messages.gradido.StateGroupChangeParent - */ -class StateGroupChangeParent extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; - */ - private $groupPublicKey = null; - /** - * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; - */ - private $newParentGroupPublicKey = null; - /** - * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; - */ - private $oldParentGroupPublicKey = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Model\Messages\Gradido\Key $groupPublicKey - * @type \Model\Messages\Gradido\Key $newParentGroupPublicKey - * @type \Model\Messages\Gradido\Key $oldParentGroupPublicKey - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\StateGroupChangeParent::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; - * @return \Model\Messages\Gradido\Key - */ - public function getGroupPublicKey() - { - return $this->groupPublicKey; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1; - * @param \Model\Messages\Gradido\Key $var - * @return $this - */ - public function setGroupPublicKey($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); - $this->groupPublicKey = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; - * @return \Model\Messages\Gradido\Key - */ - public function getNewParentGroupPublicKey() - { - return $this->newParentGroupPublicKey; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2; - * @param \Model\Messages\Gradido\Key $var - * @return $this - */ - public function setNewParentGroupPublicKey($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); - $this->newParentGroupPublicKey = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; - * @return \Model\Messages\Gradido\Key - */ - public function getOldParentGroupPublicKey() - { - return $this->oldParentGroupPublicKey; - } - - /** - * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3; - * @param \Model\Messages\Gradido\Key $var - * @return $this - */ - public function setOldParentGroupPublicKey($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class); - $this->oldParentGroupPublicKey = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/Timestamp.php b/community_server/src/Model/Messages/Gradido/Timestamp.php deleted file mode 100644 index 19721729b..000000000 --- a/community_server/src/Model/Messages/Gradido/Timestamp.php +++ /dev/null @@ -1,101 +0,0 @@ -model.messages.gradido.Timestamp - */ -class Timestamp extends \Google\Protobuf\Internal\Message -{ - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - */ - private $seconds = 0; - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - */ - private $nanos = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $seconds - * Number of complete seconds since the start of the epoch - * @type int $nanos - * Number of nanoseconds since the start of the last second - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @return int|string - */ - public function getSeconds() - { - return $this->seconds; - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @param int|string $var - * @return $this - */ - public function setSeconds($var) - { - GPBUtil::checkInt64($var); - $this->seconds = $var; - - return $this; - } - - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - * @return int - */ - public function getNanos() - { - return $this->nanos; - } - - /** - * Number of nanoseconds since the start of the last second - * - * Generated from protobuf field int32 nanos = 2; - * @param int $var - * @return $this - */ - public function setNanos($var) - { - GPBUtil::checkInt32($var); - $this->nanos = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/TimestampSeconds.php b/community_server/src/Model/Messages/Gradido/TimestampSeconds.php deleted file mode 100644 index 2a588a312..000000000 --- a/community_server/src/Model/Messages/Gradido/TimestampSeconds.php +++ /dev/null @@ -1,67 +0,0 @@ -model.messages.gradido.TimestampSeconds - */ -class TimestampSeconds extends \Google\Protobuf\Internal\Message -{ - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - */ - private $seconds = 0; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $seconds - * Number of complete seconds since the start of the epoch - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\BasicTypes::initOnce(); - parent::__construct($data); - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @return int|string - */ - public function getSeconds() - { - return $this->seconds; - } - - /** - * Number of complete seconds since the start of the epoch - * - * Generated from protobuf field int64 seconds = 1; - * @param int|string $var - * @return $this - */ - public function setSeconds($var) - { - GPBUtil::checkInt64($var); - $this->seconds = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/Transaction.php b/community_server/src/Model/Messages/Gradido/Transaction.php deleted file mode 100644 index 065cd80bb..000000000 --- a/community_server/src/Model/Messages/Gradido/Transaction.php +++ /dev/null @@ -1,166 +0,0 @@ -model.messages.gradido.Transaction - */ -class Transaction extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field uint64 id = 1; - */ - private $id = 0; - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; - */ - private $received = null; - /** - * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; - */ - private $sigMap = null; - /** - * Generated from protobuf field bytes txHash = 4; - */ - private $txHash = ''; - /** - * Generated from protobuf field bytes bodyBytes = 5; - */ - private $bodyBytes = ''; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type int|string $id - * @type \Model\Messages\Gradido\TimestampSeconds $received - * @type \Model\Messages\Gradido\SignatureMap $sigMap - * @type string $txHash - * @type string $bodyBytes - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Transaction::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field uint64 id = 1; - * @return int|string - */ - public function getId() - { - return $this->id; - } - - /** - * Generated from protobuf field uint64 id = 1; - * @param int|string $var - * @return $this - */ - public function setId($var) - { - GPBUtil::checkUint64($var); - $this->id = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; - * @return \Model\Messages\Gradido\TimestampSeconds - */ - public function getReceived() - { - return $this->received; - } - - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2; - * @param \Model\Messages\Gradido\TimestampSeconds $var - * @return $this - */ - public function setReceived($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); - $this->received = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; - * @return \Model\Messages\Gradido\SignatureMap - */ - public function getSigMap() - { - return $this->sigMap; - } - - /** - * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3; - * @param \Model\Messages\Gradido\SignatureMap $var - * @return $this - */ - public function setSigMap($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\SignatureMap::class); - $this->sigMap = $var; - - return $this; - } - - /** - * Generated from protobuf field bytes txHash = 4; - * @return string - */ - public function getTxHash() - { - return $this->txHash; - } - - /** - * Generated from protobuf field bytes txHash = 4; - * @param string $var - * @return $this - */ - public function setTxHash($var) - { - GPBUtil::checkString($var, False); - $this->txHash = $var; - - return $this; - } - - /** - * Generated from protobuf field bytes bodyBytes = 5; - * @return string - */ - public function getBodyBytes() - { - return $this->bodyBytes; - } - - /** - * Generated from protobuf field bytes bodyBytes = 5; - * @param string $var - * @return $this - */ - public function setBodyBytes($var) - { - GPBUtil::checkString($var, False); - $this->bodyBytes = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/TransactionBody.php b/community_server/src/Model/Messages/Gradido/TransactionBody.php deleted file mode 100644 index 3452d4251..000000000 --- a/community_server/src/Model/Messages/Gradido/TransactionBody.php +++ /dev/null @@ -1,193 +0,0 @@ -model.messages.gradido.TransactionBody - */ -class TransactionBody extends \Google\Protobuf\Internal\Message -{ - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - */ - private $memo = ''; - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; - */ - private $created = null; - protected $data; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type string $memo - * max 150 chars - * @type \Model\Messages\Gradido\TimestampSeconds $created - * @type \Model\Messages\Gradido\StateCreateGroup $createGroup - * @type \Model\Messages\Gradido\StateGroupChangeParent $groupChangeParent - * @type \Model\Messages\Gradido\Transfer $transfer - * @type \Model\Messages\Gradido\TransactionCreation $creation - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\TransactionBody::initOnce(); - parent::__construct($data); - } - - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - * @return string - */ - public function getMemo() - { - return $this->memo; - } - - /** - * max 150 chars - * - * Generated from protobuf field string memo = 1; - * @param string $var - * @return $this - */ - public function setMemo($var) - { - GPBUtil::checkString($var, True); - $this->memo = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; - * @return \Model\Messages\Gradido\TimestampSeconds - */ - public function getCreated() - { - return $this->created; - } - - /** - * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2; - * @param \Model\Messages\Gradido\TimestampSeconds $var - * @return $this - */ - public function setCreated($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); - $this->created = $var; - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6; - * @return \Model\Messages\Gradido\StateCreateGroup - */ - public function getCreateGroup() - { - return $this->readOneof(6); - } - - /** - * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6; - * @param \Model\Messages\Gradido\StateCreateGroup $var - * @return $this - */ - public function setCreateGroup($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateCreateGroup::class); - $this->writeOneof(6, $var); - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7; - * @return \Model\Messages\Gradido\StateGroupChangeParent - */ - public function getGroupChangeParent() - { - return $this->readOneof(7); - } - - /** - * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7; - * @param \Model\Messages\Gradido\StateGroupChangeParent $var - * @return $this - */ - public function setGroupChangeParent($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateGroupChangeParent::class); - $this->writeOneof(7, $var); - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8; - * @return \Model\Messages\Gradido\Transfer - */ - public function getTransfer() - { - return $this->readOneof(8); - } - - /** - * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8; - * @param \Model\Messages\Gradido\Transfer $var - * @return $this - */ - public function setTransfer($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\Transfer::class); - $this->writeOneof(8, $var); - - return $this; - } - - /** - * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9; - * @return \Model\Messages\Gradido\TransactionCreation - */ - public function getCreation() - { - return $this->readOneof(9); - } - - /** - * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9; - * @param \Model\Messages\Gradido\TransactionCreation $var - * @return $this - */ - public function setCreation($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\TransactionCreation::class); - $this->writeOneof(9, $var); - - return $this; - } - - /** - * @return string - */ - public function getData() - { - return $this->whichOneof("data"); - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/TransactionCreation.php b/community_server/src/Model/Messages/Gradido/TransactionCreation.php deleted file mode 100644 index ae5f86e07..000000000 --- a/community_server/src/Model/Messages/Gradido/TransactionCreation.php +++ /dev/null @@ -1,136 +0,0 @@ -model.messages.gradido.TransactionCreation - */ -class TransactionCreation extends \Google\Protobuf\Internal\Message -{ - /** - * 40 Byte - * - * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; - */ - private $receiverAmount = null; - /** - * 4 Byte - * - * Generated from protobuf field sint32 ident_hash = 2; - */ - private $ident_hash = 0; - /** - * 8 Byte - * - * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; - */ - private $target_date = null; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Model\Messages\Gradido\ReceiverAmount $receiverAmount - * 40 Byte - * @type int $ident_hash - * 4 Byte - * @type \Model\Messages\Gradido\TimestampSeconds $target_date - * 8 Byte - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\TransactionCreation::initOnce(); - parent::__construct($data); - } - - /** - * 40 Byte - * - * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; - * @return \Model\Messages\Gradido\ReceiverAmount - */ - public function getReceiverAmount() - { - return $this->receiverAmount; - } - - /** - * 40 Byte - * - * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1; - * @param \Model\Messages\Gradido\ReceiverAmount $var - * @return $this - */ - public function setReceiverAmount($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\ReceiverAmount::class); - $this->receiverAmount = $var; - - return $this; - } - - /** - * 4 Byte - * - * Generated from protobuf field sint32 ident_hash = 2; - * @return int - */ - public function getIdentHash() - { - return $this->ident_hash; - } - - /** - * 4 Byte - * - * Generated from protobuf field sint32 ident_hash = 2; - * @param int $var - * @return $this - */ - public function setIdentHash($var) - { - GPBUtil::checkInt32($var); - $this->ident_hash = $var; - - return $this; - } - - /** - * 8 Byte - * - * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; - * @return \Model\Messages\Gradido\TimestampSeconds - */ - public function getTargetDate() - { - return $this->target_date; - } - - /** - * 8 Byte - * - * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3; - * @param \Model\Messages\Gradido\TimestampSeconds $var - * @return $this - */ - public function setTargetDate($var) - { - GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class); - $this->target_date = $var; - - return $this; - } - -} - diff --git a/community_server/src/Model/Messages/Gradido/Transfer.php b/community_server/src/Model/Messages/Gradido/Transfer.php deleted file mode 100644 index 2c031d02b..000000000 --- a/community_server/src/Model/Messages/Gradido/Transfer.php +++ /dev/null @@ -1,85 +0,0 @@ -model.messages.gradido.Transfer - */ -class Transfer extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; - */ - private $senderAmounts; - /** - * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; - */ - private $receiverAmounts; - - /** - * Constructor. - * - * @param array $data { - * Optional. Data for populating the Message object. - * - * @type \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $senderAmounts - * @type \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $receiverAmounts - * } - */ - public function __construct($data = NULL) { - \GPBMetadata\Transfer::initOnce(); - parent::__construct($data); - } - - /** - * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; - * @return \Google\Protobuf\Internal\RepeatedField - */ - public function getSenderAmounts() - { - return $this->senderAmounts; - } - - /** - * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1; - * @param \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $var - * @return $this - */ - public function setSenderAmounts($var) - { - $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SenderAmount::class); - $this->senderAmounts = $arr; - - return $this; - } - - /** - * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; - * @return \Google\Protobuf\Internal\RepeatedField - */ - public function getReceiverAmounts() - { - return $this->receiverAmounts; - } - - /** - * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2; - * @param \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $var - * @return $this - */ - public function setReceiverAmounts($var) - { - $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\ReceiverAmount::class); - $this->receiverAmounts = $arr; - - return $this; - } - -} - diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php index 40be13cd3..810f20c9d 100644 --- a/community_server/src/Model/Transactions/Transaction.php +++ b/community_server/src/Model/Transactions/Transaction.php @@ -25,7 +25,7 @@ class Transaction extends TransactionBase { //$transactionBin = base64_decode($base64Data, true); //if($transactionBin == false) { //sodium_base64_VARIANT_URLSAFE_NO_PADDING - if(is_a($base64Data, '\Proto\Gradido\Transaction')) { + if(is_a($base64Data, '\Proto\Gradido\GradidoTransaction')) { $this->mProtoTransaction = $base64Data; $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes()); return; @@ -93,7 +93,11 @@ class Transaction extends TransactionBase { return $this->mTransactionBody; } - public function getFirstPublic() { + public function getFirstPublic() + { + if(!$this->mProtoTransaction || !$this->mProtoTransaction->getSigMap()) { + return ''; + } $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair(); return $sigPairs[0]->getPubKey(); } @@ -111,6 +115,7 @@ class Transaction extends TransactionBase { $sigMap = $this->mProtoTransaction->getSigMap(); if(!$sigMap) { $this->addError('Transaction', 'signature map is zero'); + //var_dump($this->mProtoTransaction); return false; } //var_dump($sigMap); @@ -193,8 +198,10 @@ class Transaction extends TransactionBase { $connection->commit(); - $this->mTransactionBody->getSpecificTransaction()->sendNotificationEmail($this->mTransactionBody->getMemo()); + $specificTransaction = $this->mTransactionBody->getSpecificTransaction(); + $specificTransaction->sendNotificationEmail($this->mTransactionBody->getMemo()); + $this->addWarnings($specificTransaction->getWarnings()); return true; } diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php index 607903d8d..6b3817201 100644 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -6,29 +6,43 @@ use Cake\ORM\TableRegistry; class TransactionBase { private $errors = []; + private $warnings = []; static $tables = []; public function getErrors() { - return $this->errors; + return $this->errors; + } + + public function getWarnings() { + return $this->warnings; } - public function addError($functionName, $errorName) { - array_push($this->errors, [$functionName => $errorName]); + array_push($this->errors, [$functionName => $errorName]); + } + public function addWarning($functionName, $warningName) { + array_push($this->warnings, [$functionName => $warningName]); } public function addErrors($errors) { - $this->errors = array_merge($this->errors, $errors); + $this->errors = array_merge($this->errors, $errors); + } + + public function addWarnings($warnings) { + $this->warnings = array_merge($this->warnings, $warnings); } public function hasErrors() { - return count($this->errors) > 0; + return count($this->errors) > 0; } + public function hasWarnings() { + return count($this->warnings) > 0; + } public static function getTable($tableName) { - if(!isset(self::$tables[$tableName])) { - self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); - } - return self::$tables[$tableName]; + if(!isset(self::$tables[$tableName])) { + self::$tables[$tableName] = TableRegistry::getTableLocator()->get($tableName); + } + return self::$tables[$tableName]; } diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php index f9b3c7657..9150d24eb 100644 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -209,6 +209,7 @@ class TransactionCreation extends TransactionBase { ->send(); } catch(Exception $e) { // $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + $this->addWarning('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index 4f3f4e88c..dc1606f55 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -58,7 +58,7 @@ class TransactionTransfer extends TransactionBase { //$this->addError('TransactionTransfer::validate', 'not implemented yet'); //return false; //$time = microtime(true); - static $functionName = 'TransactionCreation::validate'; + static $functionName = 'TransactionTransfer::validate'; $sigPubHexs = []; foreach($sigPairs as $sigPair) @@ -204,13 +204,14 @@ class TransactionTransfer extends TransactionBase { $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id); return false; } - $email->setFrom([$serverAdminEmail => $senderUser->getNames() . ' via Gradido Community']) + $noReplyEmail = Configure::read('noReplyEmail'); + $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)']) ->setTo([$receiverUser->email => $receiverUser->getNames()]) - ->setReplyTo($senderUser->email) ->setSubject(__('Gradidos erhalten')) ->send(); } catch(Exception $e) { //$this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); + $this->addWarning('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage()); return false; } return true; diff --git a/community_server/src/Template/Email/text/notification_transfer.ctp b/community_server/src/Template/Email/text/notification_transfer.ctp index 2cc692e02..155304c2c 100644 --- a/community_server/src/Template/Email/text/notification_transfer.ctp +++ b/community_server/src/Template/Email/text/notification_transfer.ctp @@ -15,7 +15,7 @@ $senderNames = $senderUser->first_name . ' ' . $senderUser->last_name; - + Gradido Community Server \ No newline at end of file diff --git a/community_server/src/Template/Transactions/manual_transaction.ctp b/community_server/src/Template/Transactions/manual_transaction.ctp new file mode 100644 index 000000000..30bda1175 --- /dev/null +++ b/community_server/src/Template/Transactions/manual_transaction.ctp @@ -0,0 +1,63 @@ +loadHelper('Form', [ + 'templates' => 'horizontal_form', +]); +$now = new \DateTime; +?> + 0) : ?> +
+ +
+ + +
+

+
+ Form->create() ?> + Form->control('type', ['type' => 'hidden', 'value' => 'creation']) ?> + Form->control('target_public_key', ['type'=> 'text']) ?> + Form->control('target_date', ['type'=> 'text', 'placeholder' => 'yyyy-mm-dd hh:ii:ss', 'default' => $now->format('Y-m-d H:i:s')]) ?> + Form->control('amount', ['type'=> 'number']) ?> + Form->control('memo', ['type'=> 'textarea', 'rows' => '8', 'cols' => 40]) ?> + Form->control('signer_public_key', ['type' => 'text']) ?> + Form->control('signer_private_key', ['type'=> 'text']) ?> + Form->submit(); ?> + Form->end() ?> +
+
+
+

+
+ Form->create() ?> + Form->control('type', ['type' => 'hidden', 'value' => 'transfer']) ?> + Form->control('sender_public_key', ['type'=> 'text']) ?> + Form->control('receiver_public_key', ['type'=> 'text']) ?> + Form->control('amount', ['type'=> 'number']) ?> + Form->control('memo', ['type'=> 'textarea', 'rows' => '8', 'cols' => 40]) ?> + Form->control('signer_public_key', ['type' => 'text']) ?> + Form->control('signer_private_key', ['type'=> 'text']) ?> + Form->submit(); ?> + Form->end() ?> +
+
+ +
+ +
+ \ No newline at end of file diff --git a/community_server/tests/Fixture/CommunityProfilesFixture.php b/community_server/tests/Fixture/CommunityProfilesFixture.php index 1259d6e25..0fa7ed764 100644 --- a/community_server/tests/Fixture/CommunityProfilesFixture.php +++ b/community_server/tests/Fixture/CommunityProfilesFixture.php @@ -23,8 +23,7 @@ class CommunityProfilesFixture extends TestFixture 'state_user_id' => ['type' => 'index', 'columns' => ['state_user_id'], 'length' => []], ], '_constraints' => [ - 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'community_profiles_ibfk_1' => ['type' => 'foreign', 'columns' => ['state_user_id'], 'references' => ['state_users', 'id'], 'update' => 'restrict', 'delete' => 'restrict', 'length' => []], + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []] ], '_options' => [ 'engine' => 'InnoDB', diff --git a/community_server/tests/Fixture/Migrations2Fixture.php b/community_server/tests/Fixture/Migrations2Fixture.php new file mode 100644 index 000000000..c8608cd18 --- /dev/null +++ b/community_server/tests/Fixture/Migrations2Fixture.php @@ -0,0 +1,45 @@ + ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], + 'db_version' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], + ], + '_options' => [ + 'engine' => 'InnoDB', + 'collation' => 'utf8mb4_unicode_ci' + ], + ]; + // @codingStandardsIgnoreEnd + /** + * Init method + * + * @return void + */ + public function init() + { + $this->table = "migrations"; + $this->records = [ + [ + 'id' => 1, + 'db_version' => 2, + ], + ]; + parent::init(); + } +} diff --git a/community_server/tests/Fixture/StateBalancesFixture.php b/community_server/tests/Fixture/StateBalancesFixture.php index f4a6fd7fc..015366c80 100644 --- a/community_server/tests/Fixture/StateBalancesFixture.php +++ b/community_server/tests/Fixture/StateBalancesFixture.php @@ -6,7 +6,7 @@ use Cake\TestSuite\Fixture\TestFixture; /** * StateBalancesFixture */ -class StateBalancesFixture extends TestFixture +class StateBalancesFixture extends BaseTestFixture { /** * Fields @@ -36,8 +36,11 @@ class StateBalancesFixture extends TestFixture */ public function init() { - $this->records = [ + $sql = [ + [4, 4, '2021-05-27 17:47:50', '2021-05-27 17:47:50', 28808497], + [5, 1, '2021-05-27 17:47:51', '2021-05-27 17:47:50', 9823963] ]; + $this->records = $this->sqlEntrysToRecords($sql, $this->fields); parent::init(); } } diff --git a/community_server/tests/Fixture/TransactionCreationsFixture.php b/community_server/tests/Fixture/TransactionCreationsFixture.php index 1833385b4..4221e8729 100644 --- a/community_server/tests/Fixture/TransactionCreationsFixture.php +++ b/community_server/tests/Fixture/TransactionCreationsFixture.php @@ -1,8 +1,6 @@ ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], 'state_user_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'ident_hash' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], 'target_date' => ['type' => 'timestamp', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], '_constraints' => [ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], @@ -37,9 +34,9 @@ class TransactionCreationsFixture extends BaseTestFixture */ public function init() { - $sql = [ - [2, 1, 4, 10000000, '0000000000000000000000000000000000000000000000000000000000000000', '2021-01-01 00:00:00'], - [3, 2, 1, 10000000, '0000000000000000000000000000000000000000000000000000000000000000', '2021-01-01 00:00:00'] + $sql = [ + [2, 1, 4, 10000000, '2021-01-01 00:00:00'], + [3, 2, 1, 10000000, '2021-01-01 00:00:00'] ]; $this->records = $this->sqlEntrysToRecords($sql, $this->fields); parent::init(); diff --git a/community_server/tests/TestCase/Controller/AppControllerTest.php b/community_server/tests/TestCase/Controller/AppControllerTest.php deleted file mode 100644 index 502ed46da..000000000 --- a/community_server/tests/TestCase/Controller/AppControllerTest.php +++ /dev/null @@ -1,46 +0,0 @@ -session(['StateUser.id' => 1]); - $this->get('/'); - $this->assertSession(1200, 'StateUser.balance'); - //$this->markTestIncomplete('Not implemented yet.'); - } - - -} diff --git a/community_server/tests/TestCase/Controller/AppRequestControllerTest.php b/community_server/tests/TestCase/Controller/AppRequestControllerTest.php new file mode 100644 index 000000000..118f25a32 --- /dev/null +++ b/community_server/tests/TestCase/Controller/AppRequestControllerTest.php @@ -0,0 +1,303 @@ +session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'id' => 1, + 'email_checked' => 1, + 'public_hex' => 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f' + ] + ]); + + $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); + $this->assertEquals('success', $response->state); + $this->assertEquals(9100000, $response->balance); + $this->assertLessThan(9100000, $response->decay); + + } + + public function testGetBalance2() + { + $session_id = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'id' => 3, + 'email_checked' => 1, + 'public_hex' => '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6' + ] + ]); + + $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); + $this->assertEquals('success', $response->state); + $this->assertEquals(0, $response->balance); + } + public function testGetBalance3() + { + $session_id = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'id' => 4, + 'email_checked' => 1, + 'public_hex' => 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2' + ] + ]); + + $response = $this->getAndParseWithoutCompare('/api/get-balance/' . $session_id); + $this->assertEquals('success', $response->state); + $this->assertEquals(10900000, $response->balance); + $this->assertLessThan(10900000, $response->decay); + } + + public function testGetBalanceInvalidSession() + { + $session_id = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'email_checked' => 1, + 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' + ] + ]); + + $this->getAndParse('/api/get-balance/' . 1211, + ['state' => 'not found', 'msg' => 'invalid session'] + ); + } + + public function testGetBalanceInvalidSessionId() + { + $session_id = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transaction' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'email_checked' => 1, + 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' + ] + ]); + + $this->getAndParse('/api/get-balance/' , + ['state' => 'not found', 'msg' => 'invalid session'] + ); + } + + /** + * Test ajaxListTransactions method + * + * @return void + */ + public function testListTransactions() + { + //ajaxListTransactions + $session_id = rand(); + $this->session([ + 'session_id' => $session_id, + 'Transactions' => ['pending' => 0, 'executing' => 0], + 'StateUser' => [ + 'id' => 1, + 'first_name' => 'Dario', + 'last_name' => 'Frodo', + 'email_checked' => 1, + 'email' => 'fördertest@gradido.org', + 'public_hex' => '94ae135b93cd9f33752b4e55c41903a3faa13a75bb90bfd411ea1d4a1a5e711f' + ] + ]); + //echo "balance: $balance"; + $expectedResult = '{ + "state": "success", + "transactions": [ + { + "name": "Gradido Akademie", + "type": "creation", + "transaction_id": 2, + "date": "2021-04-12T00:00:00+00:00", + "target_date": "2021-01-01T00:00:00+00:00", + "creation_amount": 10000000, + "balance": 10000000, + "memo": "AGE Januar 2021" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "send", + "transaction_id": 3, + "date": "2021-04-12T00:00:00+00:00", + "balance": 1000000, + "memo": "test", + "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "send", + "transaction_id": 4, + "date": "2021-04-14T00:00:00+00:00", + "balance": 100000, + "memo": "test time", + "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "send", + "transaction_id": 5, + "date": "2021-04-14T09:01:07+00:00", + "balance": 100000, + "memo": "test time", + "pubkey": "e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "receive", + "transaction_id": 6, + "date": "2021-04-14T09:02:28+00:00", + "balance": 100000, + "memo": "test time 3", + "pubkey": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "receive", + "transaction_id": 7, + "date": "2021-04-14T09:28:46+00:00", + "balance": 100000, + "memo": "test login crash", + "pubkey": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "Samuel Schmied", + "email": "test3.yahoo.com", + "type": "receive", + "transaction_id": 8, + "date": "2021-04-14T09:31:28+00:00", + "balance": 100000, + "memo": "test login crash", + "pubkey": "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + "transactionExecutingCount": 0, + "count": 7, + "gdtSum": 180000, + "timeUsed": 0.5575470924377441, + "decay_date": "2021-05-28T09:35:02+00:00", + "balance": 9100000, + "decay": 9100000 +}'; + $this->getAndParse('/api/list-transactions/', json_decode($expectedResult, true)); + } + + + private function getAndParse($path, $expected) + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + + $this->disableErrorHandlerMiddleware(); + $this->get($path); + + // Check that the response was in 2xx - 3xx + $this->assertResponseSuccess(); + $json = (object)$this->viewVariable('body'); + + if(!$json) { + // Check that the response was a 200 + $this->assertResponseOk(); + + $responseBodyString = (string)$this->_response->getBody(); + $json = json_decode($responseBodyString); + $this->assertNotFalse($json); + } else { + $responseBodyString = json_encode($json); + } + + if(is_array($expected)) { + $dynamic_fields = ['timeUsed', 'decay_date', 'decay', 'gdtSum']; + // copy timeUsed because this value will be variy always + foreach($dynamic_fields as $field) { + if(isset($expected[$field]) && isset($json->$field)) { + $expected[$field] = $json->$field; + } + } + $expected = json_encode($expected); + } + + $this->assertEquals($expected, $responseBodyString); + } + private function getAndParseWithoutCompare($path) + { + $this->configRequest([ + 'headers' => ['Accept' => 'application/json'] + ]); + + $this->disableErrorHandlerMiddleware(); + $this->get($path); + + // Check that the response was in 2xx - 3xx + $this->assertResponseSuccess(); + $view_body = $this->viewVariable('body'); + if($view_body) { + return (object)$view_body; + } + // Check that the response was a 200 + $this->assertResponseOk(); + $responseBodyString = (string)$this->_response->getBody(); + $json = json_decode($responseBodyString, true); + $this->assertNotFalse($json); + + return $json; + } +} diff --git a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php index fb882478a..c1ba84ee3 100644 --- a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php +++ b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php @@ -51,19 +51,7 @@ class JsonRequestClientComponentTest extends TestCase $this->markTestIncomplete('Not implemented yet.'); } - /** - * Test getLoginServerUrl method - * - * @return void - */ - public function testGetLoginServerUrl() - { - //$this->markTestIncomplete('Not implemented yet.'); - $serverUrl = $this->JsonRequestClientComponent->getLoginServerUrl(); - $this->assertEquals($serverUrl, 'http://***REMOVED***'); - } - - /** + /** * Test is_base64 method * * @return void diff --git a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php index d8a241d7d..f990b3e57 100644 --- a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php +++ b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php @@ -5,9 +5,9 @@ use Cake\TestSuite\IntegrationTestTrait; use Cake\TestSuite\TestCase; /** - * App\Controller\TransactionJsonRequestHandlerController Test Case + * App\Controller\JsonRequestHandlerController Test Case * - * @uses \App\Controller\TransactionJsonRequestHandlerController + * @uses \App\Controller\JsonRequestHandlerController */ class JsonRequestHandlerControllerTest extends TestCase { @@ -22,6 +22,7 @@ class JsonRequestHandlerControllerTest extends TestCase 'app.TransactionCreations', 'app.Transactions', 'app.StateUsers', + 'app.StateUserTransactions', 'app.StateErrors', 'app.TransactionSignatures', 'app.TransactionSendCoins', @@ -30,13 +31,12 @@ class JsonRequestHandlerControllerTest extends TestCase ]; public $transactions = [ - 'validCreation' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo', - 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg', - 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg', + 'validCreation' => 'CmYKZAog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfISQDnatUMvitiiP0-sY93JStYPhPKKPU4Vosv_EGrh77BVs48xhPgPj2QHWC3oyuuMh6nN8YNjBQZx20rKvdQ4uwMSRwoMQUdFIE1haSAyMDIxEgYI_c3ChQY6LwolCiD39KSaSsEDefi53ctzHE2exJXm7dFgdfUmcs0l4xefDxDQDxoGCPqbtIQG', + 'validCreation900' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQCaZHmvmvJOt336E3qst3rn1pptdAR5ZPzePaUT10x0_Yky8FnEiQtMGNy1yT94QErzwQudJZjJwDY2uyK4cTgkSOxIGCKb1vYUGOjEKJwog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfIQgNHKCBoGCIDMuf8F', + 'validCreation1200' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQF8jptIrosEyVmCf3WEIGVOK0NR8YCcO0j-s8v2yUyR5BKus0ciT6B7IA5LDtn7eQX6zHjg1v5WlsTiZuOpuNgwSRAoHVG8gbXVjaBIGCL3Jv4UGOjEKJwog4zad42I86ERtBCTEAT56HXGiZxrj178eeY6_BmXRRfIQgOy4CxoGCOG5toQG', 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3', - 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k', - 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==', - 'creationValid' => 'GmYKZAogLtKKHPXhFtg2FUBrxXcVIiHC93SlZW9moOdUD3V21xsSQHpXYAGiVmSfhjB3o7OPx0ZJuPXrDk5eu1_AOhQBODU3KpUqBRA9yMX54S_mvGijGubCNRcMLcm7wiYbyAG-3AkqSwoQZWluIE1vbmF0c2dlaGFsdBIGCKqs5vEFSi8KJwoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0QgNrECRDKyd3uAQ' + 'validTransfer' => 'CmYKZAog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8SQA0ZVQ9T1qBabzmgDO1NAWNy2J6mlv0YjMP99CiV7bSR0zemt5XoM-kTviR1aTqKggzpSYSyTN5T6gIx2xa-hgkSYwoLTXkgQmlydGhkYXkSBgie0L-FBjJMCkoKJgog9_SkmkrBA3n4ud3LcxxNnsSV5u3RYHX1JnLNJeMXnw8QgIl6EiDjNp3jYjzoRG0EJMQBPnodcaJnGuPXvx55jr8GZdFF8g', + 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==' ]; /*public function setUp() { @@ -51,7 +51,7 @@ class JsonRequestHandlerControllerTest extends TestCase $this->get('/JsonRequestHandler'); $this->assertResponseOk(); - $expected = json_encode(['state' => 'error', 'msg' => 'no post']); + $expected = json_encode(['state' => 'error', 'msg' => 'unknown method for get', 'details' => null]); $this->assertEquals($expected, (string)$this->_response->getBody()); } @@ -87,7 +87,7 @@ class JsonRequestHandlerControllerTest extends TestCase //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']); $this->postAndParse( ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']], - ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar'] + ['state' => 'error', 'msg' => 'unknown method for post', 'details' => 'foobar'] ); } @@ -97,7 +97,8 @@ class JsonRequestHandlerControllerTest extends TestCase $this->postAndParse( ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']], ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ - ['Transaction' => 'invalid base64 string'] + ['Transaction' => 'invalid base64 string'], + ['base64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3'] ]] ); } @@ -114,9 +115,10 @@ class JsonRequestHandlerControllerTest extends TestCase public function testToLargeCreationSum() { + $this->postAndParse( ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}' ); } @@ -124,49 +126,36 @@ class JsonRequestHandlerControllerTest extends TestCase { $this->postAndParse( ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' + '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1.000 GDD per Month for in target_date not allowed"}]}' ); } public function testValidTransfer() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], - ['state' => 'success'] - ); - } - - /*public function testMissingPreviousTransaction() - { - - }*/ - - public function testValidTransaction() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], - ['state' => 'success'] + { + $this->postAndParse( + ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], + ['state' => 'success'] ); } - + public function testValidCreation() { $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['creationValid']], + ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], ['state' => 'success'] ); } private function postAndParse($params, $expected) { - //$this->enableCsrfToken(); + $this->enableCsrfToken(); //$this->enableSecurityToken(); - $token = 'my-csrf-token'; - $this->cookie('csrfToken', $token); + //$token = 'my-csrf-token'; + //$this->cookie('csrfToken', $token); $this->configRequest([ - 'headers' => ['Accept' => 'application/json', 'X-CSRF-Token' => $token] + 'headers' => ['Accept' => 'application/json']//, 'X-CSRF-Token' => $token] ]); $this->disableErrorHandlerMiddleware(); diff --git a/community_server/tests/TestCase/Controller/PagesControllerTest.php b/community_server/tests/TestCase/Controller/PagesControllerTest.php index 35fe1a13b..004d7c079 100644 --- a/community_server/tests/TestCase/Controller/PagesControllerTest.php +++ b/community_server/tests/TestCase/Controller/PagesControllerTest.php @@ -27,6 +27,10 @@ use Cake\View\Exception\MissingTemplateException; */ class PagesControllerTest extends IntegrationTestCase { + + public $fixtures = [ + 'app.Migrations2' + ]; /** * testMultipleGet method * @@ -35,9 +39,12 @@ class PagesControllerTest extends IntegrationTestCase public function testMultipleGet() { $this->get('/'); - $this->assertRedirect('account/'); + $locations = $this->_response->getHeader('Location'); + $this->assertRegExp('%.*/account/$%', $locations[0]); + $this->get('/'); - $this->assertRedirect('account/'); + $locations = $this->_response->getHeader('Location'); + $this->assertRegExp('%.*/account/$%', $locations[0]); } /** @@ -64,7 +71,7 @@ class PagesControllerTest extends IntegrationTestCase $this->get('/pages/not_existing'); $this->assertResponseError(); - $this->assertResponseContains('Error'); + $this->assertResponseContains('Not Found'); } /** @@ -78,8 +85,7 @@ class PagesControllerTest extends IntegrationTestCase $this->get('/pages/not_existing'); $this->assertResponseFailure(); - $this->assertResponseContains('Missing Template'); - $this->assertResponseContains('Stacktrace'); + $this->assertResponseContains('Template file \u0022Pages\/not_existing.ctp\u0022 is missing.'); $this->assertResponseContains('not_existing.ctp'); } diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php index cfa6bebc4..9ef8d28e9 100644 --- a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php +++ b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php @@ -69,142 +69,7 @@ class StateBalancesControllerTest extends TestCase $this->markTestIncomplete('Not implemented yet.'); } - /** - * Test ajaxGetBalance method - * - * @return void - */ - public function testAjaxGetBalance1() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 1, - 'email_checked' => 1, - 'public_hex' => 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/state-balances/ajaxGetBalance/' . $session_id); - - $this->assertEquals('success', $response->state); - $this->assertEquals(7321825, $response->balance); - $this->assertLessThan(7321825, $response->decay); - - } - public function testAjaxGetBalance2() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 3, - 'email_checked' => 1, - 'public_hex' => '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/state-balances/ajaxGetBalance/' . $session_id); - $this->assertEquals('success', $response->state); - $this->assertEquals(0, $response->balance); - } - public function testAjaxGetBalance3() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 4, - 'email_checked' => 1, - 'public_hex' => 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2' - ] - ]); - - $response = $this->getAndParseWithoutCompare('/state-balances/ajaxGetBalance/' . $session_id); - $this->assertEquals('success', $response->state); - $this->assertEquals(9112592, $response->balance); - $this->assertLessThan(9112592, $response->decay); - } - - public function testAjaxGetBalanceInvalidSession() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'email_checked' => 1, - 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' - ] - ]); - //echo "balance: $balance"; - $this->getAndParse('/state-balances/ajaxGetBalance/' . 1211, - ['state' => 'not found', 'msg' => 'invalid session'] - ); - } - - public function testAjaxGetBalanceInvalidSessionId() - { - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'email_checked' => 1, - 'public_hex' => '8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d' - ] - ]); - //echo "balance: $balance"; - $this->getAndParse('/state-balances/ajaxGetBalance' , - ['state' => 'error', 'msg' => 'invalid session id'] - ); - } - - /** - * Test ajaxListTransactions method - * - * @return void - */ - public function testAjaxListTransactions() - { - //ajaxListTransactions - $session_id = rand(); - $this->session([ - 'session_id' => $session_id, - 'Transaction' => ['pending' => 0, 'executing' => 0], - 'StateUser' => [ - 'id' => 1, - 'first_name' => 'Dario', - 'last_name' => 'Frodo', - 'email_checked' => 1, - 'email' => 'fördertest@gradido.org', - 'public_hex' => '94ae135b93cd9f33752b4e55c41903a3faa13a75bb90bfd411ea1d4a1a5e711f' - ] - ]); - //echo "balance: $balance"; - $this->getAndParse('/state-balances/ajaxListTransactions/' . $session_id, - [ - 'state' => 'success', 'transactions' => [[ - 'name' => 'Dario Frodo', - 'email'=> 'dariofrodo@gmx.de', - 'type'=> '', - 'transaction_id' => 4, - 'date' => '2021-02-19T13:27:14+00:00', - 'balance' => 150000001, - 'memo' => '' - ]], - 'transactionExecutingCount' => 0, - 'count' => 1, - 'gdtSum' => 0, - 'timeUsed' => 0.03168010711669922 - ] - ); - } /** * Test overviewGdt method diff --git a/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php deleted file mode 100644 index 7ad28760c..000000000 --- a/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php +++ /dev/null @@ -1,174 +0,0 @@ - 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo', - 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg', - 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg', - 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3', - 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k', - 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==' - ]; - - /*public function setUp() { - parent::setUp(); - } -*/ - public function testWrongMethod() - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - $this->get('/TransactionJsonRequestHandler'); - $this->assertResponseOk(); - - $expected = json_encode(['state' => 'error', 'msg' => 'no post']); - $this->assertEquals($expected, (string)$this->_response->getBody()); - } - - public function testInvalidJson() - { - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - $this->post('/TransactionJsonRequestHandler', '{This isn\'t valid json}'); - $this->assertResponseOk(); - - $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']); - $this->assertEquals($expected, (string)$this->_response->getBody()); - } - - public function testNotSetTransaction() - { - $this->postAndParse( - ['method' => 'putTransaction'], - ['state' => 'error', 'msg' => 'parameter error'] - ); - } - public function testNotSetMethod() - { - $this->postAndParse( - ['transaction' => $this->transactions['validCreation']], - ['state' => 'error', 'msg' => 'parameter error'] - ); - } - - public function testUnknownMethod() - { - //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']); - $this->postAndParse( - ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']], - ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar'] - ); - - } - - public function testInvalidEncodedTransaction() { - //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}] - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']], - ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ - ['Transaction' => 'invalid base64 string'] - ]] - ); - } - - public function testInvalidTransaction() { - - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')], - ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [ - ['Transaction' => 'Error occurred during parsing: Unexpected wire type.'] - ]] - ); - } - - public function testToLargeCreationSum() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' - ); - } - - public function testToLargeCreation() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']], - '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}' - ); - } - - public function testValidTransfer() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']], - ['state' => 'success'] - ); - } - - /*public function testMissingPreviousTransaction() - { - - }*/ - - public function testValidTransaction() - { - $this->postAndParse( - ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']], - ['state' => 'success'] - ); - } - - private function postAndParse($params, $expected) - { - - $this->configRequest([ - 'headers' => ['Accept' => 'application/json'] - ]); - - $this->disableErrorHandlerMiddleware(); - $this->post('/TransactionJsonRequestHandler', json_encode($params)); - - // Check that the response was a 200 - $this->assertResponseOk(); - - $responseBodyString = (string)$this->_response->getBody(); - $json = json_decode($responseBodyString); - $this->assertNotFalse($json); - - if(is_array($expected)) { - $expected = json_encode($expected); - } - $this->assertEquals($expected, $responseBodyString); - } -} diff --git a/community_server/tests/TestCase/Model/Entity/TableTest.php b/community_server/tests/TestCase/Model/Entity/TableTest.php deleted file mode 100644 index 5a189942a..000000000 --- a/community_server/tests/TestCase/Model/Entity/TableTest.php +++ /dev/null @@ -1,51 +0,0 @@ -Table = new Table(); - } - - /** - * tearDown method - * - * @return void - */ - public function tearDown() - { - unset($this->Table); - - parent::tearDown(); - } - - /** - * Test initial setup - * - * @return void - */ - public function testInitialization() - { - $this->markTestIncomplete('Not implemented yet.'); - } -} diff --git a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php index 60a6307ed..e53549a42 100644 --- a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php +++ b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php @@ -30,84 +30,12 @@ class TransactionCreationTest extends TestCase parent::setUp(); } - - public function testHashingFunction() + public function testDummy() { - $pairs = [ - "a" => 97, - "b" => 98, - "c" => 99, - "d" => 100, - "aa" => 12513, - "ab" => 12514, - "@" => 64, - ".d" => 5988, - "gmx" => 1701624, - "@gmx" => 135919352, - "@gmx.de" => 3742152099, - "***REMOVED***" => 2928827813, - "***REMOVED***" => 1899591683, - "***REMOVED***" => 2089074830, - "maximilian.muster@gradido.net" => 793144931, - "coin-info5@gradido.net" => 1829129963, - "coin-info6@gradido.net" => 1830178539, - "coin-info8@gradido.net" => 1832275691, - "coin-info9@gradido.net" => 1833324267, - "coin-info10@gradido.net" => 3877298078, - "coin-info11@gradido.net" => 3878346654, - "coin-info12@gradido.net" => 3879395230, - "***REMOVED***" => 2089074830, - "***REMOVED***" => 3996757473, - "***REMOVED***" => 3788634614, - "***REMOVED***" => 807797884, - "***REMOVED***" => 1640973721, - "***REMOVED***" => 2025729173, - "***REMOVED***" => 1961122507, - "***REMOVED***" => 362466358, - "***REMOVED***" => 3796728871, - "***REMOVED***" => 807797884, - "***REMOVED***" => 3794905967, - "***REMOVED***" => 3077694284, - "***REMOVED***" => 3246159770, - "***REMOVED***" => 3123402690, - "testneu-11-12-3@gradido.net" => 4092403827, - "***REMOVED***" => 3151414199, - "***REMOVED***" => 3526188273, - "***REMOVED***" => 966804823, - "***REMOVED***" => 1309273258, - "***REMOVED***" => 995978784, - "***REMOVED***" => 310113324, - "***REMOVED***" => 1309273258, - "***REMOVED***" => 530108573, - "***REMOVED***" => 1734855679, - "***REMOVED***" => 767779182, - "***REMOVED***" => 2247491519, - "***REMOVED***" => 3248626267, - "***REMOVED***" => 3516649930, - "***REMOVED***" => 231214190, - "***REMOVED***" => 4247461928, - "***REMOVED***" => 324829839, - "***REMOVED***" => 3046147747, - "***REMOVED***" => 3207307415, - "***REMOVED***" => 728893500, - "***REMOVED***" => 3905254663, - "***REMOVED***" => 3207307415, - "***REMOVED***" => 1155733239, - "***REMOVED***" => 2013046423, - "***REMOVED***" => 4033835283, - "***REMOVED***" => 1945541625, - "***REMOVED***" => 2310715309, - "***REMOVED***" => 1221362064, - "***REMOVED***" => 4161339877 - ]; - foreach($pairs as $email => $cpp_hash) { - $php_hash = TransactionCreation::DRMakeStringHash($email); - // assertEquals(mixed $expected, mixed $actual[, string $message = '']) - if($php_hash != $cpp_hash) { - $this->assertEquals($cpp_hash, $php_hash, "hashes for $email don't match"); - } - } + $this->assertEquals(true, true); } + + } diff --git a/configs/community_server/app.php b/configs/community_server/app.php index f0cf46220..5acd4ce51 100644 --- a/configs/community_server/app.php +++ b/configs/community_server/app.php @@ -214,9 +214,8 @@ return [ 'timeout' => 30, 'username' => null, 'password' => null, - 'client' => null, - 'tls' => null, - 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), + 'className' => 'Smtp', + 'tls' => true ], ], @@ -304,11 +303,11 @@ return [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, - 'host' => 'localhost', + 'host' => 'mariadb', //'port' => 'non_standard_port_number', - 'username' => 'my_app', - 'password' => 'secret', - 'database' => 'test_myapp', + 'username' => 'root', + 'password' => '', + 'database' => 'gradido_community_test', //'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'cacheMetadata' => true, diff --git a/configs/login_server/grd_login_test.properties b/configs/login_server/grd_login_test.properties new file mode 100644 index 000000000..8a269694a --- /dev/null +++ b/configs/login_server/grd_login_test.properties @@ -0,0 +1,57 @@ +HTTPServer.port = 1200 +JSONServer.port = 1201 +Gradido.group_id = 1 + +crypto.server_admin_public = f909a866baec97c5460b8d7a93b72d3d4d20cc45d9f15d78bd83944eb9286b7f +crypto.server_key = a51ef8ac7ef1abf162fb7a65261acd7a +# TODO auto-generate in docker build step +crypto.app_secret = 21ffbbc616fe + +# Server admin Passphrase +# nerve execute merit pool talk hockey basic win cargo spin disagree ethics swear price purchase say clutch decrease slow half forest reform cheese able +# + +phpServer.url = http://localhost/ +phpServer.host = nginx + +loginServer.path = http://localhost/account +loginServer.default_locale = de +loginServer.db.host = mariadb +loginServer.db.name = gradido_login_test +loginServer.db.user = root +loginServer.db.password = +loginServer.db.port = 3306 + +frontend.checkEmailPath = http://localhost/reset + +email.disable = true + +#email.username = +#email.sender = +#email.admin_receiver = +#email.password = +#email.smtp.url = +#email.smtp.port = + +# binary is default, for debugging also json is possible +#hedera.consensus.message_format = json +# TESTNET or MAINNET, TESTNET is default +hedera.nettype = TESTNET + +# server setup types: test, staging or production +ServerSetupType=test +dev.default_group = docker + + +# Session timeout in minutes +# +session.timeout = 15 + +# Disabling security features for faster develop and testing +unsecure.allow_passwort_via_json_request = 1 +unsecure.allow_auto_sign_transactions = 1 +unsecure.allow_cors_all = 1 +# default disable, passwords must contain a number, a lower character, a high character, special character, and be at least 8 characters long + +unsecure.allow_all_passwords = 1 + diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 0e059140f..1060002ba 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -38,7 +38,7 @@ services: - ./login_server/dependencies:/code/dependencies - ./login_server/scripts:/code/scripts - ./configs/login_server:/etc/grd_login - - login_build_3:/code/build + - login_build_3.1:/code/build ######################################################### @@ -47,11 +47,8 @@ services: community-server: build: context: . + target: community_server dockerfile: ./community_server/Dockerfile - environment: - - DB_PASSWORD='' - - DB_USER='root' - - DB_DATABASE='gradido_community' depends_on: - mariadb networks: @@ -103,4 +100,4 @@ services: volumes: frontend_node_modules: - login_build_3: + login_build_3.1: diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 000000000..b9d44363e --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,99 @@ +version: "3.4" + +services: + + ######################################################### + ## MARIADB ############################################## + ######################################################### + mariadb: + build: + context: . + dockerfile: ./mariadb/Dockerfile + target: mariadb_server_test + environment: + - MARIADB_ALLOW_EMPTY_PASSWORD=1 + - MARIADB_USER=root + networks: + - internal-net + ports: + - 3306:3306 + volumes: + - db_test_vol:/var/lib/mysql + + ######################################################### + ## LOGIN SERVER ######################################### + ######################################################### + login-server: + build: + context: ./login_server/ + target: test + security_opt: + - seccomp:unconfined + cap_add: + - SYS_PTRACE + depends_on: + - mariadb + networks: + - internal-net + volumes: + - ./logs:/var/log/grd_login + - ./login_server/src:/code/src + - ./configs/login_server:/etc/grd_login + - login_build_cov:/code/build_cov + - ./coverage/login:/code/build_cov/coverage_html + + ######################################################### + ## COMMUNITY SERVER (cakephp with php-fpm) ############## + ######################################################### + community-server: + build: + context: . + target: test + dockerfile: ./community_server/Dockerfile + depends_on: + - mariadb + networks: + - internal-net + volumes: + - ./community_server/config/php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini + - ./community_server/src:/var/www/cakephp/src + - ./coverage/community:/var/www/cakephp/webroot/coverage + + + ######################################################### + ## PHPMYADMIN ########################################### + ######################################################### + phpmyadmin: + image: 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 + depends_on: + - mariadb + networks: + - internal-net + +networks: + external-net: + internal-net: + internal: true + +volumes: + db_test_vol: + login_build_cov: \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 59e617d71..2cc2ceff7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,7 +38,7 @@ services: build: context: . dockerfile: ./mariadb/Dockerfile - target: mariadb_server + target: mariadb_server_test environment: - MARIADB_ALLOW_EMPTY_PASSWORD=1 - MARIADB_USER=root @@ -47,7 +47,7 @@ services: ports: - 3306:3306 volumes: - - db_vol:/var/lib/mysql + - db_vol:/var/lib/mysql ######################################################### ## LOGIN SERVER ######################################### @@ -80,6 +80,7 @@ services: depends_on: - community-server - login-server + - frontend ports: - 80:80 @@ -89,6 +90,7 @@ services: community-server: build: context: . + target: community_server dockerfile: ./community_server/Dockerfile environment: - DB_PASSWORD='' diff --git a/docu/login_server.api.md b/docu/login_server.api.md index b466be7fc..fb9409cf0 100644 --- a/docu/login_server.api.md +++ b/docu/login_server.api.md @@ -89,6 +89,56 @@ In case of success returns: nginx was wrong configured. - `session_id`: can be also negative +## Check username +### Request +`GET http://localhost/login_api/checkUsername?username=&group_id=` + +`POST http://localhost/login_api/checkUsername` +with +```json +{ + "username": "Maxilein", + "group_id": 1, + "group_alias": "gdd1" +} +``` + +group_id or group_alias, one of both is enough. +group_id is better, because one db request less + +### Response + +If username is not already taken +```json +{ + "state":"success" +} +``` + +If username is already taken +```json +{ + "state":"warning", + "msg":"username already in use" +} +``` + +If only group_alias was given and group with that alias was found in db +```json +{ + "state":"success", + "group_id": 1 +} +``` + +If group_id or group_alias unknown +```json +{ + "state":"error", + "msg": "unknown group" +} +``` + ## Create user Register a new User diff --git a/frontend/src/apis/communityAPI.js b/frontend/src/apis/communityAPI.js index 25ef10f43..b2df337b8 100644 --- a/frontend/src/apis/communityAPI.js +++ b/frontend/src/apis/communityAPI.js @@ -35,7 +35,7 @@ const communityAPI = { balance: async (sessionId) => { return apiGet(CONFIG.COMMUNITY_API_URL + 'getBalance/' + sessionId) }, - transactions: async (sessionId, firstPage = 1, items = 1000, order = 'DESC') => { + transactions: async (sessionId, firstPage = 1, items = 5, order = 'DESC') => { return apiGet( `${CONFIG.COMMUNITY_API_URL}listTransactions/${firstPage}/${items}/${order}/${sessionId}`, ) diff --git a/frontend/src/apis/loginAPI.js b/frontend/src/apis/loginAPI.js index 55e32e6dd..91e92a2cc 100644 --- a/frontend/src/apis/loginAPI.js +++ b/frontend/src/apis/loginAPI.js @@ -78,6 +78,27 @@ const loginAPI = { CONFIG.LOGIN_API_URL + 'loginViaEmailVerificationCode?emailVerificationCode=' + optin, ) }, + getUserInfos: async (sessionId, email) => { + const payload = { + session_id: sessionId, + email: email, + ask: ['user.first_name', 'user.last_name'], + } + return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload) + }, + updateUserInfos: async (sessionId, email, data) => { + const payload = { + session_id: sessionId, + email, + update: { + 'User.first_name': data.firstName, + 'User.last_name': data.lastName, + 'User.description': data.description, + }, + } + return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + }, + changePassword: async (sessionId, email, password) => { const payload = { session_id: sessionId, @@ -88,6 +109,27 @@ const loginAPI = { } return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) }, + changePasswordProfile: async (sessionId, email, password, passwordNew) => { + const payload = { + session_id: sessionId, + email, + update: { + 'User.password': password, + 'User.passwordNew': passwordNew, + }, + } + return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + }, + changeUsernameProfile: async (sessionId, email, usernameNew) => { + const payload = { + session_id: sessionId, + email, + update: { + 'User.usernameNew': usernameNew, + }, + } + return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + }, updateLanguage: async (sessionId, email, language) => { const payload = { session_id: sessionId, diff --git a/frontend/src/components/PaginationButtons.spec.js b/frontend/src/components/PaginationButtons.spec.js new file mode 100644 index 000000000..7a03d0443 --- /dev/null +++ b/frontend/src/components/PaginationButtons.spec.js @@ -0,0 +1,53 @@ +import { mount } from '@vue/test-utils' +import PaginationButtons from './PaginationButtons' + +const localVue = global.localVue + +describe('PaginationButtons', () => { + let wrapper + + const Wrapper = () => { + return mount(PaginationButtons, { localVue }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders the component', () => { + expect(wrapper.find('div.pagination-buttons').exists()).toBeTruthy() + }) + + it('has previous page button disabled by default', () => { + expect(wrapper.find('button.previous-page').attributes('disabled')).toBe('disabled') + }) + + it('has bext page button disabled by default', () => { + expect(wrapper.find('button.next-page').attributes('disabled')).toBe('disabled') + }) + + it('shows the text "1 / 1" by default"', () => { + expect(wrapper.find('p.text-center').text()).toBe('1 / 1') + }) + + describe('with active buttons', () => { + beforeEach(async () => { + await wrapper.setProps({ + hasNext: true, + hasPrevious: true, + }) + }) + + it('emits show-previous when previous page button is clicked', () => { + wrapper.find('button.previous-page').trigger('click') + expect(wrapper.emitted('show-previous')).toBeTruthy() + }) + + it('emits show-next when next page button is clicked', () => { + wrapper.find('button.next-page').trigger('click') + expect(wrapper.emitted('show-next')).toBeTruthy() + }) + }) + }) +}) diff --git a/frontend/src/components/PaginationButtons.vue b/frontend/src/components/PaginationButtons.vue new file mode 100644 index 000000000..ac7ff73c6 --- /dev/null +++ b/frontend/src/components/PaginationButtons.vue @@ -0,0 +1,30 @@ + + diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 0729cbbeb..f47493aea 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -20,17 +20,25 @@ }, "decay": "Vergänglichkeit", "form": { - "cancel":"Abbrechen", + "cancel": "Abbrechen", "reset": "Zurücksetzen", - "close":"schließen", + "close": "schließen", + "edit": "bearbeiten", + "save": "speichern", "receiver":"Empfänger", "sender":"Absender", + "username":"Username", "firstname":"Vorname", "lastname":"Nachname", + "description": "Beschreibung", "email":"E-Mail", "email_repeat":"eMail wiederholen", "password":"Passwort", "password_repeat":"Passwort wiederholen", + "password_old":"altes Passwort", + "password_new":"neues Passwort", + "password_new_repeat":"neues Passwort wiederholen", + "change": "ändern", "amount":"Betrag", "memo":"Nachricht für den Empfänger", "message":"Nachricht", @@ -50,7 +58,8 @@ "validation": { "gddSendAmount": "Das Feld {_field_} muss eine Zahl zwischen {min} und {max} mit höchstens zwei Nachkommastellen sein", "is-not": "Du kannst dir selbst keine Gradidos überweisen" - } + }, + "change_username_info": "Das ändern des Usernamens bedarf mehrerer Schritte." }, "error": { "error":"Fehler" @@ -96,7 +105,6 @@ "add_work":"neuer Gemeinschaftsbeitrag" }, "profil": { - "transactions":"transactions", "activity": { "chart":"Gemeinschaftsstunden Chart", "new":"Neue Gemeinschaftsstunden eintragen", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index c99a5e204..dbb9b445c 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -1,7 +1,7 @@ { "message": "hello gradido !!", "welcome":"Welcome!", - "community": "Gemeinschaft", + "community": "Community", "logout":"Logout", "login":"Login", "signup": "Sign up", @@ -23,14 +23,22 @@ "cancel":"Cancel", "reset": "Reset", "close":"Close", + "edit": "Edit", + "save": "save", "receiver":"Receiver", "sender":"Sender", + "username":"Username", "firstname":"Firstname", "lastname":"Lastname", + "description": "Description", "email":"Email", "email_repeat":"Repeat Email", "password":"Password", "password_repeat":"Repeat password", + "password_old":"Old password", + "password_new":"New password", + "password_new_repeat":"Repeat new password", + "change": "change", "amount":"Amount", "memo":"Message for the recipient", "message":"Message", @@ -50,7 +58,8 @@ "validation": { "gddSendAmount": "The {_field_} field must be a number between {min} and {max} with at most two digits", "is-not": "You cannot send Gradidos to yourself" - } + }, + "change_username_info": "Changing the username requires several steps." }, "error": { "error":"Error" diff --git a/frontend/src/routes/routes.js b/frontend/src/routes/routes.js index 16ab3d78f..44ef1f27a 100755 --- a/frontend/src/routes/routes.js +++ b/frontend/src/routes/routes.js @@ -16,25 +16,11 @@ const routes = [ }, { path: '/profile', - component: () => import('../views/Pages/UserProfile.vue'), + component: () => import('../views/Pages/UserProfileOverview.vue'), meta: { requiresAuth: true, }, }, - // { - // path: '/profileedit', - // component: () => import('../views/Pages/UserProfileEdit.vue'), - // meta: { - // requiresAuth: true, - // }, - // }, - // { - // path: '/activity', - // component: () => import('../views/Pages/UserProfileActivity.vue'), - // meta: { - // requiresAuth: true, - // }, - // }, { path: '/transactions', component: () => import('../views/Pages/UserProfileTransactionList.vue'), diff --git a/frontend/src/store/store.js b/frontend/src/store/store.js index 1d89894fb..4c7e10a87 100644 --- a/frontend/src/store/store.js +++ b/frontend/src/store/store.js @@ -13,6 +13,18 @@ export const mutations = { sessionId: (state, sessionId) => { state.sessionId = sessionId }, + username: (state, username) => { + state.username = username + }, + firstName: (state, firstName) => { + state.firstName = firstName + }, + lastName: (state, lastName) => { + state.lastName = lastName + }, + description: (state, description) => { + state.description = description + }, } export const actions = { @@ -20,10 +32,18 @@ export const actions = { commit('sessionId', data.sessionId) commit('email', data.user.email) commit('language', data.user.language) + commit('username', data.user.username) + commit('firstName', data.user.first_name) + commit('lastName', data.user.last_name) + commit('description', data.user.description) }, logout: ({ commit, state }) => { commit('sessionId', null) commit('email', null) + commit('username', '') + commit('firstName', '') + commit('lastName', '') + commit('description', '') sessionStorage.clear() }, } @@ -39,6 +59,10 @@ export const store = new Vuex.Store({ email: '', language: null, modals: false, + firstName: '', + lastName: '', + username: '', + description: '', }, getters: {}, // Syncronous mutation of the state diff --git a/frontend/src/store/store.test.js b/frontend/src/store/store.test.js index 11dd5949b..6bc004273 100644 --- a/frontend/src/store/store.test.js +++ b/frontend/src/store/store.test.js @@ -40,7 +40,7 @@ describe('Vuex store', () => { { commit, state }, { sessionId: 1234, user: { email: 'someone@there.is', language: 'en' } }, ) - expect(commit).toHaveBeenCalledTimes(3) + expect(commit).toHaveBeenCalledTimes(7) }) it('commits sessionId', () => { @@ -74,7 +74,7 @@ describe('Vuex store', () => { it('calls two commits', () => { logout({ commit, state }) - expect(commit).toHaveBeenCalledTimes(2) + expect(commit).toHaveBeenCalledTimes(6) }) it('commits sessionId', () => { diff --git a/frontend/src/views/Layout/DashboardLayout_gdd.spec.js b/frontend/src/views/Layout/DashboardLayout_gdd.spec.js index 84c955042..62ce94322 100644 --- a/frontend/src/views/Layout/DashboardLayout_gdd.spec.js +++ b/frontend/src/views/Layout/DashboardLayout_gdd.spec.js @@ -78,7 +78,7 @@ describe('DashboardLayoutGdd', () => { }) it('has five items in the navbar', () => { - expect(navbar.findAll('ul > a')).toHaveLength(2) + expect(navbar.findAll('ul > a')).toHaveLength(3) }) it('has first item "send" in navbar', () => { @@ -103,21 +103,21 @@ describe('DashboardLayoutGdd', () => { expect(wrapper.findComponent(RouterLinkStub).props().to).toBe('/transactions') }) - // it('has tree items in the navbar', () => { - // expect(navbar.findAll('ul > li')).toHaveLength(3) - // }) - // - // it('has third item "My profile" in navbar', () => { - // expect(navbar.findAll('ul > li').at(2).text()).toEqual('site.navbar.my-profil') - // }) - // - // it.skip('has third item "My profile" linked to profile in navbar', async () => { - // navbar.findAll('ul > li > a').at(2).trigger('click') - // await flushPromises() - // await jest.runAllTimers() - // await flushPromises() - // expect(wrapper.findComponent(RouterLinkStub).props().to).toBe('/profile') - // }) + it('has tree items in the navbar', () => { + expect(navbar.findAll('ul > a')).toHaveLength(3) + }) + + it('has third item "My profile" in navbar', () => { + expect(navbar.findAll('ul > a').at(2).text()).toEqual('site.navbar.my-profil') + }) + + it.skip('has third item "My profile" linked to profile in navbar', async () => { + navbar.findAll('ul > a').at(2).trigger('click') + await flushPromises() + await jest.runAllTimers() + await flushPromises() + expect(wrapper.findComponent(RouterLinkStub).props().to).toBe('/profile') + }) // it('has fourth item "Settigs" in navbar', () => { // expect(navbar.findAll('ul > li').at(3).text()).toEqual('site.navbar.settings') diff --git a/frontend/src/views/Layout/DashboardLayout_gdd.vue b/frontend/src/views/Layout/DashboardLayout_gdd.vue index d6b9f44ff..70a35a40a 100755 --- a/frontend/src/views/Layout/DashboardLayout_gdd.vue +++ b/frontend/src/views/Layout/DashboardLayout_gdd.vue @@ -1,5 +1,5 @@