From 9aedbea8f424d1e250284408667616de7dcc8093 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 29 Aug 2023 02:24:08 +0200 Subject: [PATCH] first draft of simple tradingLevel checks --- .../federation/client/1_0/SendCoinsClient.ts | 2 +- federation/src/config/index.ts | 5 ++++ .../api/1_0/resolver/SendCoinsResolver.ts | 14 ++++++++++ .../util/settlePendingReceiveTransaction.ts | 28 ++++--------------- .../src/graphql/util/checkTradingLevel.ts | 25 +++++++++++++++++ 5 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 federation/src/graphql/util/checkTradingLevel.ts diff --git a/backend/src/federation/client/1_0/SendCoinsClient.ts b/backend/src/federation/client/1_0/SendCoinsClient.ts index d26ad80ee..3f22fdc73 100644 --- a/backend/src/federation/client/1_0/SendCoinsClient.ts +++ b/backend/src/federation/client/1_0/SendCoinsClient.ts @@ -6,8 +6,8 @@ import { backendLogger as logger } from '@/server/logger' import { SendCoinsArgs } from './model/SendCoinsArgs' import { revertSendCoins } from './query/revertSendCoins' -import { voteForSendCoins } from './query/voteForSendCoins' import { settleSendCoins } from './query/settleSendCoins' +import { voteForSendCoins } from './query/voteForSendCoins' // eslint-disable-next-line camelcase export class SendCoinsClient { diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index aceb15e98..1200bc1b8 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -55,6 +55,11 @@ const federation = { FEDERATION_API: process.env.FEDERATION_API || '1_0', FEDERATION_PORT: process.env.FEDERATION_PORT || 5010, FEDERATION_COMMUNITY_URL: process.env.FEDERATION_COMMUNITY_URL || null, + FEDERATION_TRADING_LEVEL: { + RECEIVER_COMMUNITY_URL: 'https://stage3.gradido.net/api/', + SEND_COINS: true, + AMOUNT: 100, + }, } const CONFIG = { diff --git a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts index 97c59f3ba..3218ea815 100644 --- a/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts +++ b/federation/src/graphql/api/1_0/resolver/SendCoinsResolver.ts @@ -13,6 +13,7 @@ import Decimal from 'decimal.js-light' import { fullName } from '@/graphql/util/fullName' import { settlePendingReceiveTransaction } from '../util/settlePendingReceiveTransaction' import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '../const/const' +import { checkTradingLevel } from '@/graphql/util/checkTradingLevel' @Resolver() // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -44,6 +45,11 @@ export class SendCoinsResolver { communityReceiverIdentifier, ) } + if (!(await checkTradingLevel(homeCom, amount))) { + throw new LogError( + `X-Com: configuration of Trading-Level doesn't permit requested x-com sendCoin action!`, + ) + } // second check if receiver user exists in this community const receiverUser = await DbUser.findOneBy({ gradidoID: userReceiverIdentifier }) if (!receiverUser) { @@ -52,6 +58,14 @@ export class SendCoinsResolver { homeCom.name, ) } + if ( + communitySenderIdentifier === communityReceiverIdentifier && + userReceiverIdentifier === userSenderIdentifier + ) { + throw new LogError( + `Sender and Recipient are the same: communityUUID=${communityReceiverIdentifier}, gradidoID=${userReceiverIdentifier}`, + ) + } if (memo.length < MEMO_MIN_CHARS) { throw new LogError('Memo text is too short', memo.length) } diff --git a/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts b/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts index 4c6334074..a1f9b95a7 100644 --- a/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts +++ b/federation/src/graphql/api/1_0/util/settlePendingReceiveTransaction.ts @@ -29,43 +29,25 @@ export async function settlePendingReceiveTransaction( try { logger.info('X-Com: settlePendingReceiveTransaction:', homeCom, receiverUser, pendingTx) + // ensure that no other pendingTx with the same sender or recipient exists const openSenderPendingTx = await DbPendingTransaction.count({ where: [ - { userGradidoID: pendingTx?.userGradidoID, state: PendingTransactionState.NEW }, - { linkedUserGradidoID: pendingTx?.linkedUserGradidoID, state: PendingTransactionState.NEW }, + { userGradidoID: pendingTx.userGradidoID, state: PendingTransactionState.NEW }, + { linkedUserGradidoID: pendingTx.linkedUserGradidoID!, state: PendingTransactionState.NEW }, ], }) const openReceiverPendingTx = await DbPendingTransaction.count({ where: [ - { userGradidoID: userReceiverIdentifier, state: PendingTransactionState.NEW }, - { linkedUserGradidoID: userReceiverIdentifier, state: PendingTransactionState.NEW }, + { userGradidoID: pendingTx.linkedUserGradidoID!, state: PendingTransactionState.NEW }, + { linkedUserGradidoID: pendingTx.userGradidoID, state: PendingTransactionState.NEW }, ], }) if (openSenderPendingTx > 1 || openReceiverPendingTx > 1) { throw new LogError('There are more than 1 pending Transactions for Sender and/or Recipient') } - if ( - communityReceiverIdentifier === communitySenderIdentifier && - communitySenderIdentifier === userSenderIdentifier - ) { - throw new LogError('Sender and Recipient are the same user: ', userSenderName) - } - - if (memo.length < MEMO_MIN_CHARS) { - throw new LogError('Memo text is too short', memo.length) - } - - if (memo.length > MEMO_MAX_CHARS) { - throw new LogError('Memo text is too long', memo.length) - } - const recipientUser = await DbUser.findOneByOrFail({ gradidoID: userReceiverIdentifier }) const lastTransaction = await getLastTransaction(recipientUser.id) - const pendingTx = await DbPendingTransaction.findOneByOrFail({ - userId: recipientUser.id, - userGradidoID: recipientUser.gradidoID, - }) if (lastTransaction?.id !== pendingTx.previous) { throw new LogError( diff --git a/federation/src/graphql/util/checkTradingLevel.ts b/federation/src/graphql/util/checkTradingLevel.ts new file mode 100644 index 000000000..c67d70ad7 --- /dev/null +++ b/federation/src/graphql/util/checkTradingLevel.ts @@ -0,0 +1,25 @@ +import CONFIG from '@/config' +import { Community as DbCommunity } from '@entity/Community' +import { Decimal } from 'decimal.js-light' +import { federationLogger as logger } from '@/server/logger' + +export async function checkTradingLevel(homeCom: DbCommunity, amount: Decimal): Promise { + const tradingLevel = CONFIG.FEDERATION_TRADING_LEVEL + if (homeCom.url !== tradingLevel.RECEIVER_COMMUNITY_URL) { + logger.warn( + `X-Com: tradingLevel allows to receive coins only wiht url ${tradingLevel.RECEIVER_COMMUNITY_URL}`, + ) + return false + } + if (!tradingLevel.SEND_COINS) { + logger.warn(`X-Com: tradingLevel disable general x-com sendcoin actions!`) + return false + } + if (new Decimal(tradingLevel.AMOUNT) < amount) { + logger.warn( + `X-Com: tradingLevel only allows to receive coins lower than amount of ${tradingLevel.AMOUNT}`, + ) + return false + } + return true +}