Merge branch 'main' into feat/cli-login-redirect

This commit is contained in:
quinton
2023-06-21 06:47:57 +00:00
committed by GitHub
754 changed files with 13960 additions and 11478 deletions
@@ -2,16 +2,16 @@ import {
getAuthToken,
setAuthToken,
setMfaTempToken,
setSignupTempToken} from '@app/reactQuery';
setSignupTempToken} from "@app/reactQuery";
export const PROVIDER_AUTH_TOKEN_KEY = 'infisical__provider-auth-token';
export const PROVIDER_AUTH_TOKEN_KEY = "infisical__provider-auth-token";
// depreciated: go for apiRequest module in config/api
export default class SecurityClient {
static setProviderAuthToken(tokenStr: string) {
localStorage.setItem(PROVIDER_AUTH_TOKEN_KEY, tokenStr || '')
localStorage.setItem(PROVIDER_AUTH_TOKEN_KEY, tokenStr || "")
}
static getProviderAuthToken() {
@@ -36,7 +36,7 @@ export default class SecurityClient {
const token = getAuthToken();
if (token) {
req.headers.set('Authorization', `Bearer ${token}`);
req.headers.set("Authorization", `Bearer ${token}`);
}
return fetch(req);
@@ -1,15 +1,15 @@
/* eslint-disable prefer-destructuring */
import jsrp from 'jsrp';
import jsrp from "jsrp";
import login1 from '@app/pages/api/auth/Login1';
import login2 from '@app/pages/api/auth/Login2';
import getOrganizations from '@app/pages/api/organization/getOrgs';
import getOrganizationUserProjects from '@app/pages/api/organization/GetOrgUserProjects';
import KeyService from '@app/services/KeyService';
import login1 from "@app/pages/api/auth/Login1";
import login2 from "@app/pages/api/auth/Login2";
import getOrganizations from "@app/pages/api/organization/getOrgs";
import getOrganizationUserProjects from "@app/pages/api/organization/GetOrgUserProjects";
import KeyService from "@app/services/KeyService";
import Telemetry from './telemetry/Telemetry';
import { saveTokenToLocalStorage } from './saveTokenToLocalStorage';
import SecurityClient from './SecurityClient';
import Telemetry from "./telemetry/Telemetry";
import { saveTokenToLocalStorage } from "./saveTokenToLocalStorage";
import SecurityClient from "./SecurityClient";
// eslint-disable-next-line new-cap
const client = new jsrp.client();
@@ -97,7 +97,7 @@ const attemptLogin = async (
// case: MFA is not enabled
// unset provider auth token in case it was used
SecurityClient.setProviderAuthToken('');
SecurityClient.setProviderAuthToken("");
// set JWT token
SecurityClient.setToken(token);
@@ -126,19 +126,19 @@ const attemptLogin = async (
// and not initializing the login details
const userOrgs = await getOrganizations();
const orgId = userOrgs[0]._id;
localStorage.setItem('orgData.id', orgId);
localStorage.setItem("orgData.id", orgId);
const orgUserProjects = await getOrganizationUserProjects({
orgId
});
if (orgUserProjects.length > 0) {
localStorage.setItem('projectData.id', orgUserProjects[0]._id);
localStorage.setItem("projectData.id", orgUserProjects[0]._id);
}
if (email) {
telemetry.identify(email, email);
telemetry.capture('User Logged In');
telemetry.capture("User Logged In");
}
resolve({
@@ -1,14 +1,14 @@
/* eslint-disable prefer-destructuring */
import jsrp from 'jsrp';
import jsrp from "jsrp";
import login1 from '@app/pages/api/auth/Login1';
import verifyMfaToken from '@app/pages/api/auth/verifyMfaToken';
import getOrganizations from '@app/pages/api/organization/getOrgs';
import getOrganizationUserProjects from '@app/pages/api/organization/GetOrgUserProjects';
import KeyService from '@app/services/KeyService';
import login1 from "@app/pages/api/auth/Login1";
import verifyMfaToken from "@app/pages/api/auth/verifyMfaToken";
import getOrganizations from "@app/pages/api/organization/getOrgs";
import getOrganizationUserProjects from "@app/pages/api/organization/GetOrgUserProjects";
import KeyService from "@app/services/KeyService";
import { saveTokenToLocalStorage } from './saveTokenToLocalStorage';
import SecurityClient from './SecurityClient';
import { saveTokenToLocalStorage } from "./saveTokenToLocalStorage";
import SecurityClient from "./SecurityClient";
// eslint-disable-next-line new-cap
const client = new jsrp.client();
@@ -60,9 +60,9 @@ const attemptLoginMfa = async ({
});
// unset temporary (MFA) JWT token and set JWT token
SecurityClient.setMfaToken('');
SecurityClient.setMfaToken("");
SecurityClient.setToken(token);
SecurityClient.setProviderAuthToken('');
SecurityClient.setProviderAuthToken("");
const privateKey = await KeyService.decryptPrivateKey({
encryptionVersion,
@@ -89,12 +89,12 @@ const attemptLoginMfa = async ({
// and not initializing the login details
const userOrgs = await getOrganizations();
const orgId = userOrgs[0]._id;
localStorage.setItem('orgData.id', orgId);
localStorage.setItem("orgData.id", orgId);
const orgUserProjects = await getOrganizationUserProjects({
orgId
});
localStorage.setItem('projectData.id', orgUserProjects[0]._id);
localStorage.setItem("projectData.id", orgUserProjects[0]._id);
resolve(true);
} catch (err) {
@@ -1,5 +1,5 @@
import getOrganizationUsers from '@app/pages/api/organization/GetOrgUsers';
import checkUserAction from '@app/pages/api/userActions/checkUserAction';
import getOrganizationUsers from "@app/pages/api/organization/GetOrgUsers";
import checkUserAction from "@app/pages/api/userActions/checkUserAction";
interface OnboardingCheckProps {
setTotalOnboardingActionsDone?: (value: number) => void;
@@ -23,7 +23,7 @@ const onboardingCheck = async ({
}: OnboardingCheckProps) => {
let countActions = 0;
const userActionSlack = await checkUserAction({
action: 'slack_cta_clicked'
action: "slack_cta_clicked"
});
if (userActionSlack) {
countActions += 1;
@@ -31,7 +31,7 @@ const onboardingCheck = async ({
if (setHasUserClickedSlack) setHasUserClickedSlack(!!userActionSlack);
const userActionSecrets = await checkUserAction({
action: 'first_time_secrets_pushed'
action: "first_time_secrets_pushed"
});
if (userActionSecrets) {
countActions += 1;
@@ -39,7 +39,7 @@ const onboardingCheck = async ({
if (setHasUserPushedSecrets) setHasUserPushedSecrets(!!userActionSecrets);
const userActionIntro = await checkUserAction({
action: 'intro_cta_clicked'
action: "intro_cta_clicked"
});
if (userActionIntro) {
countActions += 1;
@@ -47,16 +47,16 @@ const onboardingCheck = async ({
if (setHasUserClickedIntro) setHasUserClickedIntro(!!userActionIntro);
const userActionStar = await checkUserAction({
action: 'star_cta_clicked'
action: "star_cta_clicked"
});
if (userActionStar) {
countActions += 1;
}
if (setHasUserStarred) setHasUserStarred(!!userActionStar);
const orgId = localStorage.getItem('orgData.id');
const orgId = localStorage.getItem("orgData.id");
const orgUsers = await getOrganizationUsers({
orgId: orgId || ''
orgId: orgId || ""
});
if (orgUsers.length > 1) {
countActions += 1;
@@ -4,11 +4,12 @@ const POSTHOG_HOST =
process.env.NEXT_PUBLIC_POSTHOG_HOST! || "https://app.posthog.com";
const STRIPE_PRODUCT_PRO = process.env.NEXT_PUBLIC_STRIPE_PRODUCT_PRO!;
const STRIPE_PRODUCT_STARTER = process.env.NEXT_PUBLIC_STRIPE_PRODUCT_STARTER!;
const INTERCOM_ID = process.env.NEXT_PUBLIC_INTERCOM_ID!;
export {
ENV,
INTERCOM_ID,
POSTHOG_API_KEY,
POSTHOG_HOST,
STRIPE_PRODUCT_PRO,
STRIPE_PRODUCT_STARTER
};
STRIPE_PRODUCT_STARTER};
@@ -2,9 +2,9 @@
* @fileoverview Provides easy encryption/decryption methods using AES 256 GCM.
*/
import crypto from 'crypto';
import crypto from "crypto";
const ALGORITHM = 'aes-256-gcm';
const ALGORITHM = "aes-256-gcm";
const BLOCK_SIZE_BYTES = 16; // 128 bit
interface EncryptProps {
@@ -45,12 +45,12 @@ class Aes256Gcm {
const iv = crypto.randomBytes(BLOCK_SIZE_BYTES);
const cipher = crypto.createCipheriv(ALGORITHM, secret, iv);
let ciphertext = cipher.update(text, 'utf8', 'base64');
ciphertext += cipher.final('base64');
let ciphertext = cipher.update(text, "utf8", "base64");
ciphertext += cipher.final("base64");
return {
ciphertext,
iv: iv.toString('base64'),
tag: cipher.getAuthTag().toString('base64')
iv: iv.toString("base64"),
tag: cipher.getAuthTag().toString("base64")
};
}
@@ -64,11 +64,11 @@ class Aes256Gcm {
* @returns {string}
*/
static decrypt({ ciphertext, iv, tag, secret }: DecryptProps): string {
const decipher = crypto.createDecipheriv(ALGORITHM, secret, Buffer.from(iv, 'base64'));
decipher.setAuthTag(Buffer.from(tag, 'base64'));
const decipher = crypto.createDecipheriv(ALGORITHM, secret, Buffer.from(iv, "base64"));
decipher.setAuthTag(Buffer.from(tag, "base64"));
let cleartext = decipher.update(ciphertext, 'base64', 'utf8');
cleartext += decipher.final('utf8');
let cleartext = decipher.update(ciphertext, "base64", "utf8");
cleartext += decipher.final("utf8");
return cleartext;
}
@@ -1,14 +1,14 @@
/* eslint-disable new-cap */
import crypto from 'crypto';
import crypto from "crypto";
import jsrp from 'jsrp';
import jsrp from "jsrp";
import changePassword2 from '@app/pages/api/auth/ChangePassword2';
import SRP1 from '@app/pages/api/auth/SRP1';
import changePassword2 from "@app/pages/api/auth/ChangePassword2";
import SRP1 from "@app/pages/api/auth/SRP1";
import { saveTokenToLocalStorage } from '../saveTokenToLocalStorage';
import Aes256Gcm from './aes-256-gcm';
import { deriveArgonKey } from './crypto';
import { saveTokenToLocalStorage } from "../saveTokenToLocalStorage";
import Aes256Gcm from "./aes-256-gcm";
import { deriveArgonKey } from "./crypto";
const clientOldPassword = new jsrp.client();
const clientNewPassword = new jsrp.client();
@@ -53,7 +53,7 @@ const changePassword = async (
salt = res.salt;
} catch (err) {
setCurrentPasswordError(true);
console.log('Wrong current password', err, 1);
console.log("Wrong current password", err, 1);
}
clientOldPassword.setSalt(salt);
@@ -77,7 +77,7 @@ const changePassword = async (
hashLen: 32
});
if (!derivedKey) throw new Error('Failed to derive key from password');
if (!derivedKey) throw new Error("Failed to derive key from password");
const key = crypto.randomBytes(32);
@@ -88,7 +88,7 @@ const changePassword = async (
iv: encryptedPrivateKeyIV,
tag: encryptedPrivateKeyTag
} = Aes256Gcm.encrypt({
text: localStorage.getItem('PRIVATE_KEY') as string,
text: localStorage.getItem("PRIVATE_KEY") as string,
secret: key
});
@@ -99,7 +99,7 @@ const changePassword = async (
iv: protectedKeyIV,
tag: protectedKeyTag
} = Aes256Gcm.encrypt({
text: key.toString('hex'),
text: key.toString("hex"),
secret: Buffer.from(derivedKey.hash)
});
@@ -123,10 +123,10 @@ const changePassword = async (
});
setPasswordChanged(true);
setCurrentPassword('');
setNewPassword('');
setCurrentPassword("");
setNewPassword("");
window.location.href = '/login';
window.location.href = "/login";
// move to login page
} catch (error) {
@@ -139,7 +139,7 @@ const changePassword = async (
}
);
} catch (error) {
console.log('Something went wrong during changing the password');
console.log("Something went wrong during changing the password");
}
return true;
};
@@ -1,9 +1,9 @@
import argon2 from 'argon2-browser';
import argon2 from "argon2-browser";
import aes from './aes-256-gcm';
import aes from "./aes-256-gcm";
const nacl = require('tweetnacl');
nacl.util = require('tweetnacl-util');
const nacl = require("tweetnacl");
nacl.util = require("tweetnacl-util");
/**
* Return new base64, NaCl, public-private key pair.
@@ -47,7 +47,7 @@ const verifyPrivateKey = ({
);
if (derivedPublicKey !== publicKey) {
throw new Error('Failed to verify private key');
throw new Error("Failed to verify private key");
}
}
@@ -183,7 +183,7 @@ const encryptSymmetric = ({ plaintext, key }: EncryptSymmetricProps): EncryptSym
iv = obj.iv;
tag = obj.tag;
} catch (err) {
console.log('Failed to perform encryption');
console.log("Failed to perform encryption");
console.log(err);
process.exit(1);
}
@@ -213,12 +213,12 @@ type DecryptSymmetricProps = {
*
*/
const decryptSymmetric = ({ ciphertext, iv, tag, key }: DecryptSymmetricProps): string => {
if (!ciphertext) return '';
if (!ciphertext) return "";
let plaintext;
try {
plaintext = aes.decrypt({ ciphertext, iv, tag, secret: key });
} catch (err) {
console.log('Failed to perform decryption');
console.log("Failed to perform decryption");
process.exit(1);
}
@@ -1,13 +1,13 @@
/* eslint-disable new-cap */
import crypto from 'crypto';
import crypto from "crypto";
import jsrp from 'jsrp';
import jsrp from "jsrp";
import issueBackupPrivateKey from '@app/pages/api/auth/IssueBackupPrivateKey';
import SRP1 from '@app/pages/api/auth/SRP1';
import issueBackupPrivateKey from "@app/pages/api/auth/IssueBackupPrivateKey";
import SRP1 from "@app/pages/api/auth/SRP1";
import generateBackupPDF from '../generateBackupPDF';
import Aes256Gcm from './aes-256-gcm';
import generateBackupPDF from "../generateBackupPDF";
import Aes256Gcm from "./aes-256-gcm";
const clientPassword = new jsrp.client();
const clientKey = new jsrp.client();
@@ -58,14 +58,14 @@ const issueBackupKey = async ({
salt = res.salt;
} catch (err) {
setBackupKeyError(true);
console.log('Wrong current password', err, 1);
console.log("Wrong current password", err, 1);
}
clientPassword.setSalt(salt);
clientPassword.setServerPublicKey(serverPublicKey);
const clientProof = clientPassword.getProof(); // called M1
const generatedKey = crypto.randomBytes(16).toString('hex');
const generatedKey = crypto.randomBytes(16).toString("hex");
clientKey.init(
{
@@ -76,7 +76,7 @@ const issueBackupKey = async ({
clientKey.createVerifier(
async (err: any, result: { salt: string; verifier: string }) => {
const { ciphertext, iv, tag } = Aes256Gcm.encrypt({
text: String(localStorage.getItem('PRIVATE_KEY')),
text: String(localStorage.getItem("PRIVATE_KEY")),
secret: generatedKey
});
@@ -107,7 +107,7 @@ const issueBackupKey = async ({
);
} catch (error) {
setBackupKeyError(true);
console.log('Failed to issue a backup key');
console.log("Failed to issue a backup key");
}
return true;
};
File diff suppressed because one or more lines are too long
@@ -0,0 +1,64 @@
/* eslint-disable prefer-template */
/* eslint-disable prefer-rest-params */
/* eslint-disable @typescript-eslint/no-unused-expressions */
/* eslint-disable no-nested-ternary */
/* eslint-disable no-unexpected-multiline */
/* eslint-disable react-hooks/exhaustive-deps */
/* eslint-disable vars-on-top */
/* eslint-disable no-var */
/* eslint-disable func-names */
// @ts-nocheck
import { INTERCOM_ID as APP_ID } from "@app/components/utilities/config";
// Loads Intercom with the snippet
// This must be run before boot, it initializes window.Intercom
// prettier-ignore
export const load = () => {
(function(){
var w=window;
var ic=w.Intercom;
if(typeof ic==="function"){
ic("reattach_activator");
ic("update",w.intercomSettings);
} else {
var d=document;
var i=function() {
i.c(arguments);
};
i.q=[];
i.c=function(args) {
i.q.push(args);
};
w.Intercom=i;
var l=function() {
var s=d.createElement("script");
s.type="text/javascript";
s.async=true;
s.src="https://widget.intercom.io/widget/" + APP_ID;
var x=d.getElementsByTagName("script")[0];
x.parentNode.insertBefore(s, x);
};
if (document.readyState==="complete") {
l();
} else if (w.attachEvent) {
w.attachEvent("onload",l);
} else {
w.addEventListener("load",l,false);
}
}
})();
}
// Initializes Intercom
export const boot = (options = {}) => {
window &&
window.Intercom &&
window.Intercom("boot", { app_id: APP_ID, ...options });
};
export const update = () => {
window && window.Intercom && window.Intercom("update");
};
@@ -0,0 +1,37 @@
import { useEffect } from "react";
import { useRouter } from "next/router";
import {
boot as bootIntercom,
load as loadIntercom,
update as updateIntercom,
} from "./intercom";
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export const IntercomProvider = ({ children }: { children: any }) => {
const router = useRouter();
if (typeof window !== "undefined") {
loadIntercom();
bootIntercom();
}
useEffect(() => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const handleRouteChange = (url: string) => {
if (typeof window !== "undefined") {
updateIntercom();
}
};
router.events.on("routeChangeStart", handleRouteChange);
// If the component is unmounted, unsubscribe
// from the event with the `off` method:
return () => {
router.events.off("routeChangeStart", handleRouteChange);
};
}, [router.events]);
return children;
};
@@ -15,16 +15,16 @@ export function parseDotEnv(src: ArrayBuffer) {
let lines = src.toString();
// Convert line breaks to same format
lines = lines.replace(/\r\n?/gm, '\n');
lines = lines.replace(/\r\n?/gm, "\n");
let comments: string[] = [];
lines
.split('\n')
.split("\n")
.map((line) => {
// collect comments of each env variable
if (line.startsWith('#')) {
comments.push(line.replace('#', '').trim());
if (line.startsWith("#")) {
comments.push(line.replace("#", "").trim());
} else if (line) {
let match;
let item: [string, string, string[]] | [] = [];
@@ -34,7 +34,7 @@ export function parseDotEnv(src: ArrayBuffer) {
const key = match[1];
// Default undefined or null to empty string
let value = match[2] || '';
let value = match[2] || "";
// Remove whitespace
value = value.trim();
@@ -43,12 +43,12 @@ export function parseDotEnv(src: ArrayBuffer) {
const maybeQuote = value[0];
// Remove surrounding quotes
value = value.replace(/^(['"`])([\s\S]*)\1$/gm, '$2');
value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2");
// Expand newlines if double quoted
if (maybeQuote === '"') {
value = value.replace(/\\n/g, '\n');
value = value.replace(/\\r/g, '\r');
value = value.replace(/\\n/g, "\n");
value = value.replace(/\\r/g, "\r");
}
item = [key, value, comments];
}
@@ -1,4 +1,4 @@
import { SecretDataProps } from 'public/data/frequentInterfaces';
import { SecretDataProps } from "public/data/frequentInterfaces";
/**
* This function downloads the secrets as a .env file
@@ -10,8 +10,8 @@ const checkOverrides = async ({ data }: { data: SecretDataProps[] }) => {
let secrets: SecretDataProps[] = data!.map((secret) => Object.create(secret));
const overridenSecrets = data!.filter((secret) =>
secret.valueOverride === undefined || secret?.value !== secret?.valueOverride
? 'shared'
: 'personal'
? "shared"
: "personal"
);
if (overridenSecrets.length) {
overridenSecrets.forEach((secret) => {
@@ -1,6 +1,6 @@
import { SecretDataProps } from 'public/data/frequentInterfaces';
import { SecretDataProps } from "public/data/frequentInterfaces";
import checkOverrides from './checkOverrides';
import checkOverrides from "./checkOverrides";
/**
* This function downloads the secrets as a .env file
@@ -18,17 +18,17 @@ const downloadDotEnv = async ({ data, env }: { data: SecretDataProps[]; env: str
`${
item.comment
? `${item.comment
.split('\n')
.map((comment) => '# '.concat(comment))
.join('\n')}\n`
: ''
}${[item.key, item.value].join('=')}`
.split("\n")
.map((comment) => "# ".concat(comment))
.join("\n")}\n`
: ""
}${[item.key, item.value].join("=")}`
)
.join('\n');
.join("\n");
const blob = new Blob([file]);
const fileDownloadUrl = URL.createObjectURL(blob);
const alink = document.createElement('a');
const alink = document.createElement("a");
alink.href = fileDownloadUrl;
alink.download = `${env}.env`;
alink.click();
@@ -1,7 +1,7 @@
// import YAML from 'yaml';
// import { YAMLSeq } from 'yaml/types';
import { SecretDataProps } from 'public/data/frequentInterfaces';
import { SecretDataProps } from "public/data/frequentInterfaces";
// import { envMapping } from "../../../public/data/frequentConstants";
// import checkOverrides from './checkOverrides';
@@ -1,10 +1,10 @@
import crypto from 'crypto';
import crypto from "crypto";
import { SecretDataProps, Tag } from 'public/data/frequentInterfaces';
import { SecretDataProps, Tag } from "public/data/frequentInterfaces";
import getLatestFileKey from '@app/pages/api/workspace/getLatestFileKey';
import getLatestFileKey from "@app/pages/api/workspace/getLatestFileKey";
import { decryptAssymmetric, encryptSymmetric } from '../cryptography/crypto';
import { decryptAssymmetric, encryptSymmetric } from "../cryptography/crypto";
interface EncryptedSecretProps {
id: string;
@@ -20,7 +20,7 @@ interface EncryptedSecretProps {
secretValueCiphertext: string;
secretValueIV: string;
secretValueTag: string;
type: 'personal' | 'shared';
type: "personal" | "shared";
tags: Tag[];
}
@@ -44,7 +44,7 @@ const encryptSecrets = async ({
try {
const sharedKey = await getLatestFileKey({ workspaceId });
const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY') as string;
const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY") as string;
let randomBytes: string;
if (Object.keys(sharedKey).length > 0) {
@@ -57,7 +57,7 @@ const encryptSecrets = async ({
});
} else {
// case: a (shared) key does not exist for the workspace
randomBytes = crypto.randomBytes(16).toString('hex');
randomBytes = crypto.randomBytes(16).toString("hex");
}
secrets = secretsToEncrypt.map((secret) => {
@@ -77,7 +77,7 @@ const encryptSecrets = async ({
iv: secretValueIV,
tag: secretValueTag
} = encryptSymmetric({
plaintext: secret.value ?? '',
plaintext: secret.value ?? "",
key: randomBytes
});
@@ -87,13 +87,13 @@ const encryptSecrets = async ({
iv: secretCommentIV,
tag: secretCommentTag
} = encryptSymmetric({
plaintext: secret.comment ?? '',
plaintext: secret.comment ?? "",
key: randomBytes
});
const result: EncryptedSecretProps = {
id: secret.id,
createdAt: '',
createdAt: "",
environment: env,
secretName: secret.key,
secretKeyCiphertext,
@@ -107,15 +107,15 @@ const encryptSecrets = async ({
secretCommentTag,
type:
secret.valueOverride === undefined || secret?.value !== secret?.valueOverride
? 'shared'
: 'personal',
? "shared"
: "personal",
tags: secret.tags
};
return result;
});
} catch (error) {
console.log('Error while encrypting secrets');
console.log("Error while encrypting secrets");
}
return secrets;
@@ -1,9 +1,9 @@
import { Tag } from 'public/data/frequentInterfaces';
import { Tag } from "public/data/frequentInterfaces";
import getSecrets from '@app/pages/api/files/GetSecrets';
import getLatestFileKey from '@app/pages/api/workspace/getLatestFileKey';
import getSecrets from "@app/pages/api/files/GetSecrets";
import getLatestFileKey from "@app/pages/api/workspace/getLatestFileKey";
import { decryptAssymmetric, decryptSymmetric } from '../cryptography/crypto';
import { decryptAssymmetric, decryptSymmetric } from "../cryptography/crypto";
interface EncryptedSecretProps {
_id: string;
@@ -18,14 +18,14 @@ interface EncryptedSecretProps {
secretValueCiphertext: string;
secretValueIV: string;
secretValueTag: string;
type: 'personal' | 'shared';
type: "personal" | "shared";
tags: Tag[];
}
interface SecretProps {
key: string;
value: string | undefined;
type: 'personal' | 'shared';
type: "personal" | "shared";
comment: string;
id: string;
tags: Tag[];
@@ -57,16 +57,16 @@ const getSecretsForProject = async ({
try {
encryptedSecrets = await getSecrets(workspaceId, env);
} catch (error) {
console.log('ERROR: Not able to access the latest version of secrets');
console.log("ERROR: Not able to access the latest version of secrets");
}
const latestKey = await getLatestFileKey({ workspaceId });
// This is called isKeyAvailable but what it really means is if a person is able to create new key pairs
if (typeof setIsKeyAvailable === 'function') {
if (typeof setIsKeyAvailable === "function") {
setIsKeyAvailable(!latestKey ? encryptedSecrets.length === 0 : true);
}
const PRIVATE_KEY = localStorage.getItem('PRIVATE_KEY') as string;
const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY") as string;
const tempDecryptedSecrets: SecretProps[] = [];
if (latestKey) {
@@ -108,7 +108,7 @@ const getSecretsForProject = async ({
key
});
} else {
plainTextComment = '';
plainTextComment = "";
}
tempDecryptedSecrets.push({
@@ -125,34 +125,34 @@ const getSecretsForProject = async ({
const secretKeys = [...new Set(tempDecryptedSecrets.map((secret) => secret.key))];
const result = secretKeys.map((key, index) => ({
id: tempDecryptedSecrets.filter((secret) => secret.key === key && secret.type === 'shared')[0]
id: tempDecryptedSecrets.filter((secret) => secret.key === key && secret.type === "shared")[0]
?.id,
idOverride: tempDecryptedSecrets.filter(
(secret) => secret.key === key && secret.type === 'personal'
(secret) => secret.key === key && secret.type === "personal"
)[0]?.id,
pos: index,
key,
value: tempDecryptedSecrets.filter(
(secret) => secret.key === key && secret.type === 'shared'
(secret) => secret.key === key && secret.type === "shared"
)[0]?.value,
valueOverride: tempDecryptedSecrets.filter(
(secret) => secret.key === key && secret.type === 'personal'
(secret) => secret.key === key && secret.type === "personal"
)[0]?.value,
comment: tempDecryptedSecrets.filter(
(secret) => secret.key === key && secret.type === 'shared'
(secret) => secret.key === key && secret.type === "shared"
)[0]?.comment,
tags: tempDecryptedSecrets.filter(
(secret) => secret.key === key && secret.type === 'shared'
(secret) => secret.key === key && secret.type === "shared"
)[0]?.tags
}));
if (typeof setData === 'function') {
if (typeof setData === "function") {
setData(result);
}
return result;
} catch (error) {
console.log('Something went wrong during accessing or decripting secrets.');
console.log("Something went wrong during accessing or decripting secrets.");
}
return [];
};