From d702ed9f5d89eda5387ac8928c4b2ba549089c9b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 1 Apr 2021 04:24:46 +0200 Subject: [PATCH 1/5] moved graphic files into subfolder updated neue-struktur graphic --- docu/{ => graphics}/cookie.drawio | 0 docu/{ => graphics}/cookie.png | Bin docu/{ => graphics}/frontend_vue.drawio | 0 docu/{ => graphics}/frontend_vue.png | Bin docu/{ => graphics}/neue-struktur.drawio | 151 +++++++++++++--------- docu/graphics/neue-struktur.png | Bin 0 -> 104333 bytes docu/{ => graphics}/release-stages.drawio | 0 docu/{ => graphics}/release-stages.png | Bin docu/{ => graphics}/repo-structure.drawio | 0 docu/{ => graphics}/repo-structure.png | Bin docu/neue-struktur.png | Bin 79799 -> 0 bytes 11 files changed, 92 insertions(+), 59 deletions(-) rename docu/{ => graphics}/cookie.drawio (100%) rename docu/{ => graphics}/cookie.png (100%) rename docu/{ => graphics}/frontend_vue.drawio (100%) rename docu/{ => graphics}/frontend_vue.png (100%) rename docu/{ => graphics}/neue-struktur.drawio (65%) create mode 100644 docu/graphics/neue-struktur.png rename docu/{ => graphics}/release-stages.drawio (100%) rename docu/{ => graphics}/release-stages.png (100%) rename docu/{ => graphics}/repo-structure.drawio (100%) rename docu/{ => graphics}/repo-structure.png (100%) delete mode 100644 docu/neue-struktur.png diff --git a/docu/cookie.drawio b/docu/graphics/cookie.drawio similarity index 100% rename from docu/cookie.drawio rename to docu/graphics/cookie.drawio diff --git a/docu/cookie.png b/docu/graphics/cookie.png similarity index 100% rename from docu/cookie.png rename to docu/graphics/cookie.png diff --git a/docu/frontend_vue.drawio b/docu/graphics/frontend_vue.drawio similarity index 100% rename from docu/frontend_vue.drawio rename to docu/graphics/frontend_vue.drawio diff --git a/docu/frontend_vue.png b/docu/graphics/frontend_vue.png similarity index 100% rename from docu/frontend_vue.png rename to docu/graphics/frontend_vue.png diff --git a/docu/neue-struktur.drawio b/docu/graphics/neue-struktur.drawio similarity index 65% rename from docu/neue-struktur.drawio rename to docu/graphics/neue-struktur.drawio index 98d84b645..2a1505762 100644 --- a/docu/neue-struktur.drawio +++ b/docu/graphics/neue-struktur.drawio @@ -1,158 +1,191 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - - + + - + - - + + - + - - + + - + - + - - + + - + - + - - + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docu/graphics/neue-struktur.png b/docu/graphics/neue-struktur.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4a4e7afcbcd816a4c703cb9146106923527cc3 GIT binary patch literal 104333 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 Zbf*7-rcL6m=Rbhg5l8n!H3v^7{|j$h;<^9; literal 0 HcmV?d00001 diff --git a/docu/release-stages.drawio b/docu/graphics/release-stages.drawio similarity index 100% rename from docu/release-stages.drawio rename to docu/graphics/release-stages.drawio diff --git a/docu/release-stages.png b/docu/graphics/release-stages.png similarity index 100% rename from docu/release-stages.png rename to docu/graphics/release-stages.png diff --git a/docu/repo-structure.drawio b/docu/graphics/repo-structure.drawio similarity index 100% rename from docu/repo-structure.drawio rename to docu/graphics/repo-structure.drawio diff --git a/docu/repo-structure.png b/docu/graphics/repo-structure.png similarity index 100% rename from docu/repo-structure.png rename to docu/graphics/repo-structure.png diff --git a/docu/neue-struktur.png b/docu/neue-struktur.png deleted file mode 100644 index 43036a4a94dfc4c6cdd4a035e5bcb4a08633d0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79799 zcmeEv2UwHI);}tWE-ET2D$<)GMLL2I73l&>Rq7%FQlk($Bw{br&;$f56zNKp7F zKQS>eZP3;_YRJU2lFY=!ymjpwaAmM$4L1{$t_)25B+Sj%!O7L0Nk~TR(_ca|>frA) zPPUF7wr)bw`<>1R$s84umX_1@FgA7cJfeBlSN@dyaRomwm>swbo^ZEyv;XwWaa%`w zaVf^t#YWtGH9c(4oz;V$v3CW}o$>wj)By$APcNSFTWVTH;nM|2kLBJL8~dXFolwD7`ca#?xB%PL5}ndzO+v@ae@!4C9d%wN5 z_-pySPvc_@3cL$`d_zJ@mpq|f9(GGl0j*{zHq6$;(SAveGK@>hT5S(?vj=^GM?CCZ zZDCH{U$$<$q+gD|J_lM`nltc+oA2VJetUwKbm-rIM*cF%E`q^#knGZ=dfU2sElrn( z2h<&A?|$afP(Bm+mn!aa)(K{Bbk25BJA445eW}g>K3&zIu27Ff4U>`IZ+k#W0X*Uf z^MJb8e|AUusDk`{hWis?LA=jOHlbo>iV^~mR^uw0v3k;gXR>L ze){|dQ&I<(uATi1qNJCh_0OoT;#YF~8%%&m7LnsiFp*gzfD%fV!MRzFki?>HsD zVLAh=8Ghl9@%@wP{7-TE8>0PQXtLDxXJ~Q^>gePST!N9k2QcBUY~dfEh^^$EfhK z(lQkIH+B9k)?mad43RKU{eP#zOQG=Rp~iPZhvmrUheUtBiE~l7K!AUY4j`IcivB)@ ziHx6&w-%@8FOUAdF(r%E{v7~&sq4>BMGfla=H>1LV+5Q38f1~T-M`<#;akWeqp*L! zn%eh87HJS6Ee7A8g)GZ3@_EFveC^Lb%c7x4@Bd8N`hcqb%LM&nAzc1<5H2PA{RA!b zwYOBWb+JFLbzDeV-W4#cBd3AGly_wO^{)xa|Gjj4S$Y3~jxPuEe@4fpzJ?TaCwKqF zgp8K4-m$OZlt06LeyoQ7K1h-I=M;R|4*rakrT@=xpZ{Hy0toF_8Ie!vuJ7O!mplIq zr~fq|@$bakWtWZrGmQAxQFp2TGy3~mC~@8uVlGcrFWSoxm__dC3kh8xvaU{4-!#EZaKq*X9O)Y+Z!RGT-|j@}Iw?FhXW2KKU_f|7DE6Yy{sX^1rG5 zmofTcWdE0ES7eqJAiuz(MQ!{JG5T`npQ*jEy(jGJ1&KXJZ0%e?mC)X=h}NG;mD|hM zDJ~WReN`rOWd8xVe|4GA@67?M^nDuLKk%@BMIa-yv>5caH2~KBS<#`)5|jVj8a}1I zzlSv}b^ed7VLA2wpJWcpYQ5wfzGV&H%)Kwa_h$l5nI%f~W6WXM9sKJ8PMIa%^0`{e zE-p8G54HZ9G%f4zUy9~GHn>?=|;I_17AXy1N)@`H~6YVYw6M# zYe!4h{)~5&`=P<&cTnV|h4;@<;*)-T2k-dF4S!Jp_n*)FzvUf&Ejs*Meg6{gDEmXx ziC=ohWo`amup8@!PFZEYgmd0n%;y3MK*$@0FIR7^)IsdmZhi`EI zPsHgvxB?Kb5d8jJ4m|yuG7`4>-XD<6cm~+X?F6rQMMn_8FJ8~}hC4caL$N(1Y zWO-NEQq=pGFIUMeP09~30Qsd%<`0?_M#cCMI4c?W2c{eXYln*7
aIp~tC?!?Uf5HxZS(5G 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 VM~)1lyf=V91056X3auND{ujb)I3WN4 From 0fc0e84dd8df473d8612dd6ec1d9d5679ae0cbac Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 1 Apr 2021 04:25:06 +0200 Subject: [PATCH 2/5] README.md to have an overview --- docu/README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docu/README.md diff --git a/docu/README.md b/docu/README.md new file mode 100644 index 000000000..3cd6d64a2 --- /dev/null +++ b/docu/README.md @@ -0,0 +1,48 @@ +# Gradido Documentation + +## APIs + +The API Documentation is separated by which server answers them. Either the community server or login server. Therefore the documentation is split into two parts accordingly. + +- [login-server API](./login_server.api.md) +- [community-server API](./community-server.api.md) + +## Graphics + +The following Graphics try to show certain mechanics, principles and structures of the gradido project + +### Cookie mechanic +![](./graphics/cookie.png) + +### Software structure transition + +An Idea of how to transform the Software structure step by step to keep it working, while transitioning to a more modern and strict structure. +The basic Idea is to create a unified API to communicate with the outside world, while the existing services are hidden behind it. Furthermore the community server is under consideration to be absorbed by this new unified API Interface. This would remove PHP as language from the project, unify the API and separate front from backend. + +In the long run (shown as the last section in the graphic) it could be wise to fully decentralize the login server completely. + +![](./graphics/neue-struktur.png) + +### Old or outdated stuff + +Graphics get outdated - this section is the graveyard for those. + +#### Software release plan stage0-3 + +In the past a waterfall-like development method was used which resulted in multiple big branches not yet compatible. This graphic shows how and in which order those branches o existing code could be integrated. + +We quickly managed to go from `stage0` to `stage1`. `stage2` and `stage3` will be one step now, if we can reuse this code. + +![](./graphics/release-stages.png) + +#### Frontend authentication idea + +Some ideas of regarding fixing the broken authentication + +![](./graphics/frontend_vue.png) + +#### Repo structure + +One upon a time the repository was split into multiple parts. This compartimalisation resulted in some inefficiencies which were resolved by merging (most of) them into a mono repository. The following graphic was made to explain the idea and plan the "mono-repoisation" + +![](./graphics/repo-structure.png) \ No newline at end of file From 3c0999f163269c36bd23be47bdc332c5c8da0f8f Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 1 Apr 2021 04:25:19 +0200 Subject: [PATCH 3/5] cleaned community-server.api.md and unified it --- docu/community-server.api.md | 176 ++++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 64 deletions(-) diff --git a/docu/community-server.api.md b/docu/community-server.api.md index bcd5da61d..2ecf853d8 100644 --- a/docu/community-server.api.md +++ b/docu/community-server.api.md @@ -1,31 +1,45 @@ -# community server api +# Community Server API -In this examples I assume that you use gradido with or docker-compose build on your local maschine +This document describes the community server API. The community server is written in PHP and mixes front with backend. Furthermore cakePHP and its auto-generated controller structure is used to access the API. This whole part of the Software will be subject to refactoring. -## Konto Overview -return current account balance +// TODO In this examples I assume that you use gradido with or docker-compose build on your local maschine -GET http://localhost/state-balances/ajaxGetBalance/-127182 +## Error handling + +// TODO + +## Account overview +Returns the current account balance + +### Request +`GET http://localhost/state-balances/ajaxGetBalance/-127182` + +### Response +Assuming: session is valid -If session is valid, return: ```json -{"state":"success","balance":174500} +{ + "state":"success", + "balance":174500 +} ``` -- balance: Gradido Cent, 4 Nachkommastellen (2 Reserve), 174500 = 17,45 GDD -## List Transactions -List all transactions from logged in user, currently without paging -Ajax: -GET http://localhost/state-balances/ajaxListTransactions/-127182/ -or -GET http://localhost/state-balances/ajaxListTransactions/-127182/DESC -to get transaction in descending order +- `balance`: balance describes gradido cents which are 4 digits behind the separator. A balance value of 174500 equals therefor 17,45 GDD + +## List transactions +List all transactions for logged in user + +### Request +`GET http://localhost/state-balances/ajaxListTransactions/-127182/[DESC]` +(The `DESC` part is optional symbolized by []) + +### Response +Assuming: session is valid -Antwort: -Wenn alles okay: ```json -{"state":"success", "transactions": - [ +{ + "state":"success", + "transactions": [ { "name": "Max Mustermann", "email": "Maxim Mustermann", @@ -44,37 +58,42 @@ Wenn alles okay: } ``` -- name: name of other involved party or empty if unknown (if other party don't belong to group) +- `transactionExecutingCount`: how many transaction for this user currently pending and waiting for signing +- `count`: sum of finished transactions user is involved +- `gdtSum`: sum of gdt of user in cent with 2 places (Nachkommastellen) +- `timeUsed`: time used for getting data from db in seconds, only for analyse backend performance + +Transaction: +- `name`: name of other involved party or empty if unknown (if other party don't belong to group) - if type is send, name is name of receiver - if type is receive, name is name of sender - if type is creation currently I use a static string ("Gradido Akademie) -- email: optional, only if type is send or receive and other user is known -- pubkey: optional, only if type is send or receive and other user isn't known -- type: type of transaction - - creation: user has get gradidos created - - send: user has send another user gradidos - - receiver: user has received gradidos from another user -- transaction_id: id of transaction in db, in stage2 also the hedera sequence number of transaction -- date: date of ordering transaction (booking date) -- balance: Gradido Cent, 4 Nachkommastellen (2 Reserve), 1920000 = 192,00 GDD -- memo: Details about transaction -- pubkey: optional, if other party isn't known, hexadecimal representation of 32 Byte public key of user [0-9a-f] +- `email`: optional, only if type is send or receive and other user is known +- `pubkey`: optional, only if type is send or receive and other user isn't known, hexadecimal representation of 32 Byte public key of user [0-9a-f] +- `type`: type of transaction + - `creation`: user has get gradidos created + - `send`: user has send another user gradidos + - `receiver`: user has received gradidos from another user +- `transaction_id`: id of transaction in db, in stage2 also the hedera sequence number of transaction +- `date`: date of ordering transaction (booking date) +- `balance`: Gradido Cent, 4 Nachkommastellen (2 Reserve), 1920000 = 192,00 GDD +- `memo`: Details about transaction -- transactionExecutingCount: how many transaction for this user currently pending and waiting for signing -- count: sum of finished transactions user is involved -- gdtSum: sum of gdt of user in cent with 2 places (Nachkommastellen) -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance +## Creation transaction +Makes a creation transaction to create new Gradido -## Creation Transaction -Make a creation transaction -With new Option set in Login-Server: +This assumes you have set ```ini unsecure.allow_auto_sign_transactions = 1 ``` -transactions can be auto-signed directly with handing in transaction. -Normally a forwarding to login-server check transactions side is neccessary to minimize security risks. +in the Login-Server, so transactions can be auto-signed directly with handing in the transaction. +Normally a forwarding to login-server check transactions side is necessary to minimize security risks. // TODO this is not documented + +### Request +`POST http://localhost/transaction-creations/ajaxCreate` + +with -POST http://localhost/transaction-creations/ajaxCreate ```json { "session_id" : -127182, @@ -85,22 +104,36 @@ POST http://localhost/transaction-creations/ajaxCreate "auto_sign": true } ``` -return if everything is ok: -```json -{"state":"success", "timeUsed": 0.0122} -``` -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance -## Send Coins Transaction -Make a simple GDD Transaction, send Coins from one user to other. -With new Option set in Login-Server: +// TODO description of fields + +### Response +In case of success returns: + +```json +{ + "state":"success", + "timeUsed": 0.0122 +} +``` + +- `timeUsed`: time used for getting data from db in seconds, only for analyse backend performance + +## Send transaction +Make a simple GDD Transaction, send Coins from logged in user to another. + +This assumes you have set ```ini unsecure.allow_auto_sign_transactions = 1 ``` -transactions can be auto-signed directly with handing in transaction. -Normally a forwarding to login-server check transactions side is neccessary to minimize security risks. +in the Login-Server, so transactions can be auto-signed directly with handing in the transaction. +Normally a forwarding to login-server check transactions side is necessary to minimize security risks. // TODO this is not documented + +### Request +`POST http://localhost/transaction-send-coins/ajaxCreate` + +with -POST http://localhost/transaction-send-coins/ajaxCreate ```json { "session_id" : -127182, @@ -110,22 +143,37 @@ POST http://localhost/transaction-send-coins/ajaxCreate "auto_sign": true } ``` -- amout: amount to transfer, 2000000 = 200,00 GDD -- email: receiver email address, must be differ from user email -- memo: Details about transaction -- auto_sign: set to true to directly sign transaction if unsecure.allow_auto_sign_transactions = 1 is set -return if everything is ok: +- `amount`: amount to transfer, 2000000 = 200,00 GDD +- `email`: receiver email address, must be differ from user email +- `memo`: Details about transaction +- `auto_sign`: set to true to directly sign transaction if unsecure.allow_auto_sign_transactions = 1 is set + + +### Response +In case of success returns: + ```json -{"state":"success", "timeUsed": 0.0122} +{ + "state":"success", + "timeUsed": 0.0122 +} ``` -- timeUsed: time used for getting data from db in seconds, only for analyse backend performance -Than the transaction was created on community server, send to login-server, signed (if unsecure.allow_auto_sign_transactions = 1 and auto_sign = true) -and send back to community server and put into db. -After you get this answear you see the new transaction if you list transactions or call for the balance. +- `timeUsed`: time used for getting data from db in seconds, only for analyse backend performance -Without auto-sign the transaction is pending on login-server and waits for the user to review it at -http://localhost/account/checkTransactions +### Process + +Once the transaction was created on community server, send to login-server, signed (if unsecure.allow_auto_sign_transactions = 1 and auto_sign = true) and then send back to community server to be finally put into the database. + +After you get this answer you see the new transaction if you request the transaction list or call for the balance. + +// TODO balance and at least last transaction must be returned with the call itself + +Without auto-sign the transaction is pending on the login-server and waits for the user to review it at `http://localhost/account/checkTransactions` + +// TODO how is this more secure? +// TODO Is this in line with our usability goals? +// TODO Should this not be handled client side? From 2fc45c94ef9a6c60775b689ea962860edb3d616b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 1 Apr 2021 21:05:51 +0200 Subject: [PATCH 4/5] cleaned login_server.api.md to be more precise and well structured --- docu/login_server.api.md | 466 ++++++++++++++++++++++++--------------- 1 file changed, 291 insertions(+), 175 deletions(-) diff --git a/docu/login_server.api.md b/docu/login_server.api.md index c221b03e8..a1b82aa54 100644 --- a/docu/login_server.api.md +++ b/docu/login_server.api.md @@ -1,236 +1,321 @@ -# login server api +# Login Server API -Gradido js-Frontend vereinfachte Zusammenarbeit mit Login-Server und Community-Server +This document describes the login server API. The login server is written in C++ and mixes front with backend. +The primary task of the login server is to store and handle the private keys of the users securely. -Es ist mit einer Zusatz-Option möglich das Login und Registrieren via ajax-Request passiern kann. -Dafür muss in der Login-Server Config +## Configuration +You can configure the login server to handle login and register requests via http call, by setting the following config option: ```ini -unsecure.allow_passwort_via_json_request = 1 +unsecure.allow_passwort_via_json_request = 1 ``` -gesetzt sein. +To disable CORs restrictions you can set: -mit: ```ini unsercure.allow_cors_all = 1 ``` -Wird bei allen JSON-Requests zum Header hinzugefügt: -- Access-Control-Allow-Origin:* -- Access-Control-Allow-Headers: "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers" +This will result in all JSON-Request headers to contain: -In diesen Beispielen gehe ich jetzt davon aus, das du das gesamte Gradido Projekt mit Docker gebaut hast und auf dem lokalen Rechner laufen lässt. - -Login -Einloggen über: - - -## unsecureLogin - -POST http://localhost/login_api/unsecureLogin -```json -data: {"email": "max.musterman@gmail.de", "password": "123abcDE&"} +``` + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers" ``` -Wenn alles okay ist erhältst du zum Beispiel: +## Error handling + +// TODO + +## Login +To login you can use the `unsecureLogin` request + +### Request +`POST http://localhost/login_api/unsecureLogin` + +with: + ```json -{"state":"success", "session_id": -127182, "clientIP":"52.68.96.58"} +{ + "email": "max.musterman@gmail.de", + "password": "123abcDE&" +} ``` -- clientIP: should be the same as where the js-client is running, else maybe a man-in-the-middle attacks is happening or + +### Response +In case of success returns: + +```json +{ + "state":"success", + "session_id": -127182, + "clientIP":"123.123.123.123" +} +``` + +- `clientIP`: should be the same as where the js-client is running, else maybe a man-in-the-middle attacks is happening or nginx was wrong configured. -- session_id: can be also negative +- `session_id`: can be also negative -Anmelden -Registrieren kannst du einen neuen Benutzer mit: +## Create user +Register a new User +### Request +`POST http://localhost/login_api/createUser` -## createUser +with: -POST http://localhost/login_api/createUser ```json -data: { +{ "email":"max.musterman@gmail.de", "first_name":"Max", "last_name":"Musterman" , "emailType": 2, - "password":"123abcDE&" + "password":"123abcDE&", "login_after_register":true - } +} ``` -- emailType: control email-text sended with email verification code +- `emailType`: control email-text sended with email verification code - 2: default, if user has registered directly - 5: if user was registered by an admin -- login_after_register: if set to true auto-login after create user was successfull, means session cookie is set and session_id returned +- `login_after_register`: if set to true auto-login after create user was successfull, means session cookie is set and session_id returned + +### Response +In case of success returns: -Wenn alles okay ist erhältst du: ```json -{"state":"success"} +{ + "state":"success" +} ``` -Dann wurde für den Benutzer ein neues Konto angelegt, seine Schlüssel generiert und ihm eine Bestätigungs-Email geschickt. +Now a new user is registered, its keys were generated and it can be logged in. A confirmation EMail has been sent to the user as well. +// TODO return type if `login_after_register=true` is used ## Logout +To logout an logged in session: + +### Request +`POST http://localhost/login_api/logout` + +with: -Abmelden -POST http://localhost/login_api/logout ```json -data: {"session_id": -127182} +{ + "session_id": -127182 +} ``` -Wenn alles okay ist erhältst du: +### Response +In case of success returns: + ```json -{"state":"success"} +{ + "state":"success" +} ``` -## Update User Data -Update first name, last name, user language and enable/disable user -Language currently supported de and en -User will be disabled if he wants a account delete but has transactions. -Until transactions are saved in real blockchain, we need this data because the public key -is in db only saved in state_users so we wenn delete this entry, validating all transactions not longer possible. -Disabled User cannot login and cannot receive transactions. -In update Object only one of the sets needs to be there. +## Update user data +This request allows you to update first name, last name, user language and enable/disable user. + +Additionally the user's password can be changed if the following option is set: -Update password can only be used if in Login-Server config: ```ini unsecure.allow_passwort_via_json_request = 1 ``` -is set -POST http://localhost/login_api/updateUserInfos +### Request +`POST http://localhost/login_api/updateUserInfos` + +with: + ```json -{"session_id": -127182, "email": "max.musterman@gmail.de", "update": { - "User.first_name": "Max", - "User.last_name" : "Musterman", - "User.disabled": 0, - "User.language": "de" - "User.password": "1234" - } -} -``` -also valid -```json -{"session_id": -127182, "email": "max.musterman@gmail.de", "update": { - "User.last_name" : "Musterman" - } +{ + "session_id": -127182, + "email": "max.musterman@gmail.de", + "update": { + "User.first_name": "Max", + "User.last_name" : "Musterman", + "User.disabled": 0, + "User.language": "de" + "User.password": "1234" + } } ``` -It returns if everything is okay +Notes: +- `user.language`: currently supports `de` and `en` only +- User will be disabled if he wants his account deleted, but has transactions. Until transactions are saved in real blockchain, we need this data because the public key is in db only saved in state_users so if we delete this entry, validating all transactions is no longer possible. +- Disabled Users can neither login nor receive transactions. +- It is not required to provide all fields of `update`, it can be a subset depending on what you intend to change. + +### Response +In case of success: + ```json -{"state":"success", "valid_values": 4, "errors":[]} +{ + "state":"success", + "valid_values": 4, + "errors": [...] +} ``` -- valid_values: should contain count of entrys in update if no error occured (User.password will not be counted) -- errors: contain on error string for every entry in update, which type isn't like expected - - password: + +- `valid_values`: should contain count of entries in update if no error occurred (User.password will not be counted) +- `errors`: contain on error string for every entry in update, which type isn't like expected + - `password`: - "new password is the same as old password": no change taking place - "password changed, coludn"t load private key for re-encryption": password was successfully changed, is at the moment only a warning as long as user_backups are unencrypted, safe to ignore - "stored pubkey and private key didn't match": error by re-encryption keys, no changes saved - "User.password isn't valid": if password validation failed, followed by reasons why (additional array in array) - example: - ```json - {"errors":[ - "User.password isn't valid",[ - "Passwort: Dein Passwort ist zu kurz!\n", - "Passwort: Bitte gebe ein gültiges Password ein mit mindestens 8 Zeichen, Groß- und Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen (@$!%*?&+-_) ein!\n" - ] - ], - "state":"success", - "valid_values":0 - } - ``` -## Retrieve User Data -Retrieve different user data, in ask only one field is needed, or every possible combination -from the available fields + Example: + ```json + { + "errors": [ + "User.password isn't valid", + [ + "Passwort: Dein Passwort ist zu kurz!\n", + "Passwort: Bitte gebe ein gültiges Password ein mit mindestens 8 Zeichen, Groß- und Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen (@$!%*?&+-_) ein!\n" + ] + ], + "state":"success", + "valid_values":0 + } + ``` + +## Retrieve user data +Retrieve different user data. + +You can query a subset of data or all of it at once. + +Normal Users can only retrieve data for themselves, admins (login-server admin) can retrieve data for every user. -Normal User can only retrieve data for himself, admins (login-server admin) can retrieve data from every user Email is also the email address of user from which data are asked -POST http://localhost/login_api/getUserInfos +### Request +`POST http://localhost/login_api/getUserInfos` + +with: + ```json -{"session_id": -127182, "email": "max.musterman@gmail.de", "ask": [ - "EmailVerificationCode.Register", - "loginServer.path", - "user.pubkeyhex", - "user.first_name", - "user.last_name", - "user.disabled", - "user.email_checked", - ] -} -``` -returns if no error occured: -```json -{"state": "success", "userData": { - "EmailVerificationCode.Register": "2718271129122", - "pubkeyhex": "131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6", - "first_name": "Max", - "last_name": "Musterman", - "disabled": 0, - "email_checked": 1 - }, "server": { - "loginServer.path": "http://localhost/account" - }, - "errors": [] +{ + "session_id": -127182, + "email": "max.musterman@gmail.de", + "ask": [ + "EmailVerificationCode.Register", + "loginServer.path", + "user.pubkeyhex", + "user.first_name", + "user.last_name", + "user.disabled", + "user.email_checked", + ] } ``` -Return only the fields which are defined in ask -- EmailVerificationCode.Register: return the email verification code for check email (create one if none exist), work only if logged in user is admin and the email isn't from him -- loginServer.path: the redirect path to login-server, for example for login with login-server html frontend -- user.pubkeyhex: public key of user in hex-format -- user.first_name: first name of user -- user.last_name: last name of user -- user.disabled: User will be disabled if he wants a account delete but has transactions. -Until transactions are saved in real blockchain, we need this data because the public key -is in db only saved in state_users so we wenn delete this entry, validating all transactions not longer possible. -Disabled User cannot login and cannot receive transactions. -- email_checked: If user has clicked on link in verification email (register), can only transfer gradidos if email_checked is 1 +### Response +In case of success: -- errors: array of strings if error occure +```json +{ + "state": "success", + "userData": { + "EmailVerificationCode.Register": "2718271129122", + "pubkeyhex": "131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6", + "first_name": "Max", + "last_name": "Musterman", + "disabled": 0, + "email_checked": 1 + }, + "server": { + "loginServer.path": "http://localhost/account" + }, + "errors": [] +} +``` + +Return only the fields which are defined in request +- `EmailVerificationCode.Register`: return the email verification code for check email (create one if none exist), work only if logged in user is admin and the email isn't from him +- `loginServer.path`: the redirect path to login-server, for example for login with login-server html frontend +- `user.pubkeyhex`: public key of user in hex-format +- `user.first_name`: first name of user +- `user.last_name`: last name of user +- `user.disabled`: User will be disabled if he wants a account delete but has transactions. Until transactions are saved in real blockchain, we need this data because the public key +is in db only saved in state_users so if we delete this entry, validating all transactions is no longer possible. Disabled User cannot login and cannot receive transactions. +- `email_checked`: If user has clicked on link in verification email (register), can only transfer gradidos if email_checked is 1 +- `errors`: array of strings if error occure ## Login by Email Verification Code -Used for replace http://localhost/account/checkEmail -Can be used to set check_email to 1 (will be done automaticly if called with valid email verification code of type register or registerDirect) -Can be used for password reset (additional step required: call update user info with new password) +Login while confirming your EMail. This API call is used to replace http://localhost/account/checkEmail (HTML). -GET http://localhost/login_api/loginViaEmailVerificationCode?emailVerificationCode=382738273892983 +If successful `check_email` will be set to 1 in the database. + +// TODO why would I want to do this? +// TODO ??? (will be done automaticly if called with valid email verification code of type register or registerDirect) +// TODO ??? Can be used for password reset (additional step required: call update user info with new password) + +### Request +`GET http://localhost/login_api/loginViaEmailVerificationCode?emailVerificationCode=382738273892983` + +### Response +In case of success returns: -return ```json -{"state":"success", "email_verification_code_type":"resetPassword","info":[],"session_id":1853761475} +{ + "state":"success", "email_verification_code_type":"resetPassword", + "info":[], + "session_id":1853761475 +} ``` -- email_verification_code_type - - resetPassword: for password resets, will be deleted immediately, is a only one use code - - registerDirect: code generated by register for check email - - register: code generated by auto-register via elopage for check email -- info can contain additional info strings + +- `email_verification_code_type` + - `resetPassword`: for password resets, will be deleted immediately, is a only one use code + - `registerDirect`: code generated by register for check email + - `register`: code generated by auto-register via elopage for check email +- `info`: can contain additional info strings - "user hasn't password": if user hasn't set a password yet (for example if he was registered via elopage) - "email already activated": if email was already checked -- session_id: session_id for new session +- `session_id`: session_id for new session -## Send Emails -Let send Login-Server Password reset E-Mail to User -Can be also used for admin interface to resend email verification code +## Send E-Mails +Lets you send Login-Server Password reset E-Mail to an user. +Can be also used for the admin interface to resend email verification codes + +### Request +`POST http://localhost/login_api/sendEmail` + +with: -POST http://localhost/login_api/sendEmail ```json -{"email": "max.musterman@gmail.de", "email_text":7, "email_verification_code_type":"resetPassword" } +{ + "email": "max.musterman@gmail.de", + "email_text":7, "email_verification_code_type":"resetPassword" +} ``` + also valid: + ```json -{"email": "max.musterman@gmail.de", "email_text":"user reset Password", "email_verification_code_type":"resetPassword" } +{ + "email": "max.musterman@gmail.de", + "email_text":"user reset Password", "email_verification_code_type":"resetPassword" } ``` -or: +// TODO this makes no sense, why two fields email_text & code_type? + +or: + ```json -{"session_id": -127182, "email": "max.musterman@gmail.de", "email_text":5, "email_verification_code_type":"register" } +{ + "session_id": -127182, + "email": "max.musterman@gmail.de", + "email_text":5, + "email_verification_code_type":"register" +} ``` -- session_id: not needed for resetPassword emails -- email_type: choose which email text should be used (number or string can be used) +- `session_id`: not needed for resetPassword emails +- `email_type`: choose which email text should be used (number or string can be used) - "email user verification code" (2): default text used when new user has registered - "email user verification code resend" (3): text used when user hasn't activated his account 7 days after register - "email user verification code resend after long time" (4): text used when user hasn't activated his account more than 7 days after register @@ -238,31 +323,40 @@ or: - "email admin user verification code resend" (6): used if admin trigger sending the email with email verification code again - "user reset Password" (7): used for reset password email text - "email custom tex" (8): used if custom email text should be used (than email_custom_text and email_custom_subject must also be filled) -- email_verification_code_type +- `email_verification_code_type` - resetPassword: for password resets, will be deleted immediately, is a only one use code, can be used without session_id - registerDirect: code generated by register for check email, can only be used by admins for another user - register: code generated by auto-register via elopage for check email, can only be used by admins for another user -- email_custom_text (optional): can be used to send email with custom text +- `email_custom_text`: (optional) can be used to send email with custom text placeholder for email text, will be replaced - [first_name] first name - [last_name] last name - [duration] time span since user has created account (ex.: 10 Days) with largest unit, day is last unit - [link] login-server checkEmail link with email verification code (ex.: http://localhost/account/checkEmail/382738273892983) - [code] email verification code if you like to use your one link -- email_custom_subject (optional): for custom email the subject +- `email_custom_subject`: (optional) for custom email the subject -return -```json -{"state":"success"} -``` -if everything is okay -return -```json -{"state":"warning", "msg":"email already sended"} -``` -if emails was successfully sended but was already sended in past also. +### Response +In case of success returns: -return with "state":"error" and additional "msg" if error occured (no email sended): +```json +{ + "state":"success" +} +``` + +or: + +```json +{ + "state":"warning", + "msg":"email already sended" +} +``` +(if emails was successfully sent but was already sent before) + +Furthermore following error cases can take place: +A result with `"state":"error"` and an additional `"msg"` if an error occurred (no email sended): - "email already send less than a hour before": User has already get a password reset email and haven't used the link yet - "not supported email type": with "email_verification_code_type":"resetPassword" only email type 7 or 8 allowed - "admin needed": only admins can send email verification emails because this emails normally sended out automaticly @@ -272,18 +366,28 @@ return with "state":"error" and additional "msg" if error occured (no email send - "invalid verification code type": could not parse email verification code type - "json exception": error parsing input json, more infos can be found in details - ## Check Running Transactions / password encryption Check if transactions on login-server for user are processed -GET http://localhost/login_api/getRunningUserTasks?email=max.musterman%40gmail.de -**OR** -POST http://localhost/login_api/getRunningUserTasks + +### Request +`GET http://localhost/login_api/getRunningUserTasks?email=max.musterman%40gmail.de` + +or: + +`POST http://localhost/login_api/getRunningUserTasks` + +with: + ```json -{"email":"max.musterman@gmail.de"} +{ + "email":"max.musterman@gmail.de" +} ``` -return +### Response +In case of success returns: + ```json { "state":"success", @@ -295,21 +399,33 @@ return } } ``` -return only entrys which > 0 + +return only entries which > 0 - password creation: after register or password change, login possible after tasks is finish - sign transaction: after check transaction in backend, before transaction is in db - prepare transaction: after sending transaction to login-server, before they can be checked - ready for sign transaction: transactions ready for signing from user ## Check Session State -GET http://localhost/login_api/checkSessionState?session_id=-127182 +Check if a given session is still valid + +### Request +`GET http://localhost/login_api/checkSessionState?session_id=-127182` + +### Response +In case of success returns: -return if session is still open ```json -{"state":"success"} -``` -else return -```json -{"state":"not found", "msg": "session not found"} +{ + "state":"success" +} ``` +or: + +```json +{ + "state":"not found", + "msg": "session not found" +} +``` \ No newline at end of file From 87fc75f62da55313dc8a3750eb7c800b69390a08 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 2 Apr 2021 17:36:26 +0200 Subject: [PATCH 5/5] added darios comment --- docu/comment_dario.md | 76 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docu/comment_dario.md diff --git a/docu/comment_dario.md b/docu/comment_dario.md new file mode 100644 index 000000000..18c4e51c7 --- /dev/null +++ b/docu/comment_dario.md @@ -0,0 +1,76 @@ +## Software structure transition +I would be happy if you label GraphQL more detailed for example "new community server with GraphQL-Interface" +Everytime I read only GraphQL its trigger me, because GraphQL is only a standard not a server. +I don't think it is wise to remove the login-server complete, because than user left only with two options sending gradidos securly: +- with a native mobile app (saving keys in secure storage) +- Managing there keys/passphrase themself and copy them into client everytime they want so send gradidos like with webwallets (https://www.myetherwallet.com/access-my-wallet) + +My suggestion is to see the login-server as third option for inexperienced users to handle Gradidos as easy as paypal. +So the Login-Server can be optional in your graphic. +When the new community-server gets already signed transactions he can send it directly to the blockchain/blockchain-gate, if not signed he can send it to login-server for signing. We can change it so that the new community-server gets signed transactions back so login-server only sign transactions, not sending them anymore into the blockchain-network, + +## Frontend authentication idea +Why the extra step with JWT? +The Login-Server save the session-id in Cookie GRADIDO_LOGIN and if vue is running from same domain it could access the cookie directly. But more important the browser is sending the cookie automaticly so I need only to change Login-Server Json API to not using session_id instead reading in the session_id from cookie. + +## Repo structure +Yes, scripts are for deploying on bare metal, so they not used in docker setup. + +## Community Server API +### Send transaction +"// TODO balance and at least last transaction must be returned with the call itself" +Do you mean last transaction before freshly sended transaction or this freshly sended transaction? +I can give you the new balance after the transaction was successfully written into blockchain. +The send transaction call is actually a asychronous call, it's return very fast but transaction will be processed after it some time. With Hedera up to 2 minutes. + +"// TODO how is this more secure?" +For me posting the transaction data again in pure html with disabled js directly from login-server is more secure, because if +a corrupted js-client manipulate transaction without user knowing, +user has the chance to notice it and cancel the transaction. Or if js-client has an error, but that shouldn't happen with enough tests. + +So the only way to manipulating transaction server-side is hacking the login-server, getting sudo password, change and recompile c++ code and restart login-server with new version. And even for that scenario I have a idea to prevent that. +If login-server ask for a password after starting which he will use additional for encrypt user privat keys a hacker which restart login-server without the right passwort cannot doing anything with that. Even if User login-in no transactions can be signed because private keys of users cannot decrypted. For protecting password in-memory I have also some ideas, which I haven't implemented yet, but it exist some possibilities. + +Yes it is also possible to change the pure html page received from login-server with a proxy or with a manipulated browser but I think that is harder to archieve. And you must do it for every user, while hacking serverside can has a greater impact to more user. The cost-benefit ratio is much better. + +"// TODO Is this in line with our usability goals? // TODO Should this not be handled client side?" +I don't see where it intercept with usability. Confirm transaction is normal in online-banking-software. +And with the same style user don't notice that they on a different server. Like on the production server or stage1 with old interface. +This concept I have from the start, but with my idea from yesterday serve client-js from login-server we can reduce the risk of corrupted js-client and js-client can handle it by themself. +Maybe we can make it optional so that user can choose between security and simpler use without confirming transaction. + +## Login Server API +### Login by Email Verification Code +"// TODO why would I want to do this? " +Maybe the title is misleading. +In Old frontend: +If user clicked on link in verification email, he land on http://localhost/account/checkEmail/[code]. +Than if code was found in db, check_email will be set to 1 and user will be logged in and redirected to his Dashboard. +On most pages I have used I have experienced it this way. But it isn't a full login. If user now wants to send gradidos in http://localhost/account/checkTransaction password will be requested. +But if a session from the user was still in memory this session will be used and is therefore a full login. +So this api call act mainly as replacement for this function for using with new client. + +// TODO ??? (will be done automaticly if called with valid email verification code of type register or registerDirect) +Sorry, was a bit unclear (._.) +Also check_email will be set to 1 if called with valid email verification code of type register or registerDirect, not with email verification code of type resetPassword. + +// TODO ??? Can be used for password reset (additional step required: call update user info with new password) +Yes maybe not clear, I reuse the email verification code function for password reset because it's mostly the same. +Login by code but with redirect to page for choosing new password. +So if someone likes to reset his passwords and use this in old frontend: http://localhost/account/resetPassword +a new email verification code of type resetPassword is created and a email with this code in the link http://localhost/account/checkEmail/[code] is sended to user. If he clicks on it he get logged in and redirect to http://localhost/account/updateUserPassword page to choose a new password. Then his private keys will reincrypted with the new password and he will redirected to Dashboard. + +### Send E-Mails +// TODO this makes no sense, why two fields email_text & code_type? +I don't know which you prefer so I use both. +In C++ I use enums for that so I have a name and a number. +I have seen in vue-client code that you have created a enum like object: +```js +// control email-text sended with email verification code +const EMAIL_TYPE = { + DEFAULT: 2, // if user has registered directly + ADMIN: 5, // if user was registered by an admin +} +``` +and wasn't sure if it is okay if I only offer the number variant. +So which way you prefer, number or string? \ No newline at end of file