From 9cf28fef5fdf7f278a73d1da006be5ef215191b1 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Wed, 4 Jan 2023 18:54:45 -0800 Subject: [PATCH] Service tokens update on frontend --- .../src/controllers/v2/workspaceController.ts | 2 +- .../basic/dialog/AddServiceTokenDialog.js | 36 +++++++------- ...iceTokenTable.js => ServiceTokenTable.tsx} | 43 +++++++++++++---- .../pages/api/serviceToken/addServiceToken.ts | 25 ++++++---- .../api/serviceToken/deleteServiceToken.ts | 30 ++++++++++++ .../api/serviceToken/getServiceTokens.ts | 4 +- frontend/pages/settings/project/[id].js | 47 +++---------------- 7 files changed, 107 insertions(+), 80 deletions(-) rename frontend/components/basic/table/{ServiceTokenTable.js => ServiceTokenTable.tsx} (62%) create mode 100644 frontend/pages/api/serviceToken/deleteServiceToken.ts diff --git a/backend/src/controllers/v2/workspaceController.ts b/backend/src/controllers/v2/workspaceController.ts index 62dcebda6..cc289c81d 100644 --- a/backend/src/controllers/v2/workspaceController.ts +++ b/backend/src/controllers/v2/workspaceController.ts @@ -190,7 +190,7 @@ export const getWorkspaceServiceTokenData = async ( ) => { let serviceTokenData; try { - const { workspaceId } = req.query; + const { workspaceId } = req.params; serviceTokenData = await ServiceTokenData .find({ diff --git a/frontend/components/basic/dialog/AddServiceTokenDialog.js b/frontend/components/basic/dialog/AddServiceTokenDialog.js index b02a804b7..d1ed17190 100644 --- a/frontend/components/basic/dialog/AddServiceTokenDialog.js +++ b/frontend/components/basic/dialog/AddServiceTokenDialog.js @@ -12,6 +12,7 @@ import { envMapping } from "../../../public/data/frequentConstants"; import { decryptAssymmetric, encryptAssymmetric, + encryptSymmetric, } from "../../utilities/cryptography/crypto"; import Button from "../buttons/Button"; import InputField from "../InputField"; @@ -25,6 +26,8 @@ const expiryMapping = { "12 months": 31104000, }; +const crypto = require('crypto'); + const AddServiceTokenDialog = ({ isOpen, closeModal, @@ -48,16 +51,14 @@ const AddServiceTokenDialog = ({ privateKey: localStorage.getItem("PRIVATE_KEY"), }); - // generate new public/private key pair - const pair = nacl.box.keyPair(); - const publicKey = nacl.util.encodeBase64(pair.publicKey); - const privateKey = nacl.util.encodeBase64(pair.secretKey); - - // encrypt workspace key under newly-generated public key - const { ciphertext: encryptedKey, nonce } = encryptAssymmetric({ + const randomBytes = crypto.randomBytes(16).toString('hex'); + const { + ciphertext, + iv, + tag, + } = encryptSymmetric({ plaintext: key, - publicKey, - privateKey, + key: randomBytes, }); let newServiceToken = await addServiceToken({ @@ -65,13 +66,12 @@ const AddServiceTokenDialog = ({ workspaceId, environment: envMapping[serviceTokenEnv], expiresIn: expiryMapping[serviceTokenExpiresIn], - publicKey, - encryptedKey, - nonce, + encryptedKey: ciphertext, + iv, + tag }); - const serviceToken = newServiceToken + "," + privateKey; - setServiceToken(serviceToken); + setServiceToken(newServiceToken); }; function copyToClipboard() { @@ -161,7 +161,7 @@ const AddServiceTokenDialog = ({ "Production", "Testing", ]} - width="full" + isFull={true} text={`${t("common:environment")}: `} /> @@ -176,7 +176,7 @@ const AddServiceTokenDialog = ({ "6 months", "12 months", ]} - width="full" + isFull={true} text={`${t("common:expired-in")}: `} /> @@ -211,7 +211,7 @@ const AddServiceTokenDialog = ({
-
+
- {t("common.click-to-copy")} + {t("common:click-to-copy")}
diff --git a/frontend/components/basic/table/ServiceTokenTable.js b/frontend/components/basic/table/ServiceTokenTable.tsx similarity index 62% rename from frontend/components/basic/table/ServiceTokenTable.js rename to frontend/components/basic/table/ServiceTokenTable.tsx index 6e5cc65ea..a79acd759 100644 --- a/frontend/components/basic/table/ServiceTokenTable.js +++ b/frontend/components/basic/table/ServiceTokenTable.tsx @@ -1,19 +1,37 @@ -import { useEffect, useState } from 'react'; -import { useRouter } from 'next/router'; import { faX } from '@fortawesome/free-solid-svg-icons'; +import { useNotificationContext } from '~/components/context/Notifications/NotificationProvider'; + +import deleteServiceToken from "../../../pages/api/serviceToken/deleteServiceToken"; import { reverseEnvMapping } from '../../../public/data/frequentConstants'; import guidGenerator from '../../utilities/randomId'; import Button from '../buttons/Button'; +interface TokenProps { + _id: string; + name: string; + environment: string; + expiresAt: string; +} + +interface ServiceTokensProps { + data: TokenProps[]; + workspaceName: string; + setServiceTokens: (value: TokenProps[]) => void; +} + /** - * This is the component that we utilize for the user table - in future, can reuse it for some other purposes too. + * This is the component that we utilize for the service token table * #TODO: add the possibility of choosing and doing operations on multiple users. - * @param {*} props + * @param {object} obj + * @param {any[]} obj.data - current state of the service token table + * @param {string} obj.workspaceName - name of the current project + * @param {function} obj.setServiceTokens - updating the state of the service token table * @returns */ -const ServiceTokenTable = ({ data, workspaceName }) => { - const router = useRouter(); +const ServiceTokenTable = ({ data, workspaceName, setServiceTokens }: ServiceTokensProps) => { + console.log(data) + const { createNotification } = useNotificationContext(); return (
@@ -30,7 +48,7 @@ const ServiceTokenTable = ({ data, workspaceName }) => { {data?.length > 0 ? ( - data.map((row, index) => { + data.map((row) => { return ( {