diff --git a/.gitignore b/.gitignore index a5dadd281..caed320af 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ messages.pot nbproject .metadata /.env +package-lock.json diff --git a/backend/package.json b/backend/package.json index 4719595bb..4620db4ad 100644 --- a/backend/package.json +++ b/backend/package.json @@ -26,6 +26,7 @@ "graphql": "^15.5.1", "jest": "^27.2.4", "jsonwebtoken": "^8.5.1", + "libsodium-wrappers": "^0.7.9", "mysql2": "^2.3.0", "reflect-metadata": "^0.1.13", "ts-jest": "^27.0.5", @@ -35,6 +36,7 @@ "devDependencies": { "@types/express": "^4.17.12", "@types/jsonwebtoken": "^8.5.2", + "@types/libsodium-wrappers": "^0.7.9", "@typescript-eslint/eslint-plugin": "^4.28.0", "@typescript-eslint/parser": "^4.28.0", "eslint": "^7.29.0", diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index f0ba6efb2..ec52bef8b 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -23,7 +23,7 @@ import { User as dbUser } from '../../typeorm/entity/User' import { UserTransaction as dbUserTransaction } from '../../typeorm/entity/UserTransaction' import { Transaction as dbTransaction } from '../../typeorm/entity/Transaction' -import { apiGet, apiPost } from '../../apis/HttpRequest' +import { apiPost } from '../../apis/HttpRequest' import { roundFloorFrom4 } from '../../util/round' import { calculateDecay, calculateDecayWithInterval } from '../../util/decay' import { TransactionTypeId } from '../enum/TransactionTypeId' @@ -216,13 +216,9 @@ export class TransactionResolver { @Args() { currentPage = 1, pageSize = 25, order = Order.DESC }: Paginated, @Ctx() context: any, ): Promise { - // get public key for current logged in user - const result = await apiGet(CONFIG.LOGIN_API_URL + 'login?session_id=' + context.sessionId) - if (!result.success) throw new Error(result.data) - // load user const userRepository = getCustomRepository(UserRepository) - const userEntity = await userRepository.findByPubkeyHex(result.data.user.public_hex) + const userEntity = await userRepository.findByPubkeyHex(context.pubKey) const transactions = await listTransactions(currentPage, pageSize, order, userEntity) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 5a2a049de..820e493c6 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -2,12 +2,14 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' +import { from_hex as fromHex } from 'libsodium-wrappers' import CONFIG from '../../config' import { CheckUsernameResponse } from '../model/CheckUsernameResponse' import { LoginViaVerificationCode } from '../model/LoginViaVerificationCode' import { SendPasswordResetEmailResponse } from '../model/SendPasswordResetEmailResponse' import { UpdateUserInfosResponse } from '../model/UpdateUserInfosResponse' import { User } from '../model/User' +import { User as DbUser } from '../../typeorm/entity/User' import encode from '../../jwt/encode' import ChangePasswordArgs from '../arg/ChangePasswordArgs' import CheckUsernameArgs from '../arg/CheckUsernameArgs' @@ -102,6 +104,18 @@ export class UserResolver { throw new Error(result.data) } + const user = new User(result.data.user) + const dbuser = new DbUser() + dbuser.pubkey = Buffer.from(fromHex(user.pubkey)) + dbuser.email = user.email + dbuser.firstName = user.firstName + dbuser.lastName = user.lastName + dbuser.username = user.username + + dbuser.save().catch(() => { + throw new Error('error saving user') + }) + return 'success' } diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index 7ea97ada9..81457ab34 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -14,6 +14,8 @@ async function calculateDecay(amount: number, from: Date, to: Date): Promise to + // Do we want to have negative decay? const decayDuration = (to.getTime() - from.getTime()) / 1000 return decayFormula(amount, decayDuration) } diff --git a/backend/yarn.lock b/backend/yarn.lock index 714823fe9..11401ccf0 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -888,6 +888,11 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/libsodium-wrappers@^0.7.9": + version "0.7.9" + resolved "https://registry.npmjs.org/@types/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz" + integrity sha512-LisgKLlYQk19baQwjkBZZXdJL0KbeTpdEnrAfz5hQACbklCY0gVFnsKUyjfNWF1UQsCSjw93Sj5jSbiO8RPfdw== + "@types/long@^4.0.0": version "4.0.1" resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" @@ -914,9 +919,9 @@ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^14.11.2": - version "14.17.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.4.tgz#218712242446fc868d0e007af29a4408c7765bc0" - integrity sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A== + version "14.17.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.21.tgz#6359d8cf73481e312a43886fa50afc70ce5592c6" + integrity sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA== "@types/prettier@^2.1.5": version "2.4.1" @@ -1686,7 +1691,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -1694,14 +1699,6 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -3874,6 +3871,18 @@ libphonenumber-js@^1.9.7: resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.22.tgz" integrity sha512-nE0aF0wrNq09ewF36s9FVqRW73hmpw6cobVDlbexmsu1432LEfuN24BCudNuRx4t2rElSeK/N0JbedzRW/TC4A== +libsodium-wrappers@^0.7.9: + version "0.7.9" + resolved "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" diff --git a/login_server/src/cpp/JSONInterface/JsonCreateUser.cpp b/login_server/src/cpp/JSONInterface/JsonCreateUser.cpp index 97cb4ea3a..d8238c3ee 100644 --- a/login_server/src/cpp/JSONInterface/JsonCreateUser.cpp +++ b/login_server/src/cpp/JSONInterface/JsonCreateUser.cpp @@ -150,16 +150,16 @@ Poco::JSON::Object* JsonCreateUser::handle(Poco::Dynamic::Var params) emailOptIn->setBaseUrl(user->getGroupBaseUrl() + ServerConfig::g_frontend_checkEmailPath); em->addEmail(new model::Email(emailOptIn, user, model::Email::convertTypeFromInt(emailType))); + Poco::JSON::Object* result = stateSuccess(); + result->set("user", user->getJson()); if (login_after_register && session) { - Poco::JSON::Object* result = stateSuccess(); if(group_was_not_set) { Poco::JSON::Array infos; infos.add("group_id was not set, use 1 as default!"); result->set("info", infos); } result->set("session_id", session->getHandle()); - return result; } - return stateSuccess(); + return result; }