feat: resolved tiny bug secret blind indexing

This commit is contained in:
Akhil Mohan
2024-01-27 20:23:19 +05:30
parent 66d258f02b
commit 8f754d659a
3 changed files with 47 additions and 10 deletions
+1 -2
View File
@@ -1,5 +1,4 @@
import knex from "knex";
import knex from "knex"
export type TDbClient = ReturnType<typeof initDbConnection>; export type TDbClient = ReturnType<typeof initDbConnection>;
export const initDbConnection = (dbConnectionUri: string) => { export const initDbConnection = (dbConnectionUri: string) => {
@@ -58,8 +58,36 @@ export const secretBlindIndexDALFactory = (db: TDbClient) => {
} }
}; };
const findSecretsByProjectId = async (projectId: string, secretIds: string[], tx?: Knex) => {
try {
const docs = await (tx || db)(TableName.Secret)
.leftJoin(
TableName.SecretFolder,
`${TableName.SecretFolder}.id`,
`${TableName.Secret}.folderId`
)
.leftJoin(
TableName.Environment,
`${TableName.Environment}.id`,
`${TableName.SecretFolder}.envId`
)
.where({ projectId })
.whereIn(`${TableName.Secret}.id`, secretIds)
.whereNull("secretBlindIndex")
.select(selectAllTableCols(TableName.Secret))
.select(
db.ref("slug").withSchema(TableName.Environment).as("environment"),
db.ref("projectId").withSchema(TableName.Environment).as("workspace")
);
return docs;
} catch (error) {
throw new DatabaseError({ error, name: "CountOfSecretWillNullSecretBlindIndex" });
}
};
return { return {
...secretBlindIndexOrm, ...secretBlindIndexOrm,
findSecretsByProjectId,
countOfSecretsWithNullSecretBlindIndex, countOfSecretsWithNullSecretBlindIndex,
findAllSecretsByProjectId findAllSecretsByProjectId
}; };
@@ -14,7 +14,7 @@ import {
type TSecretBlindIndexServiceFactoryDep = { type TSecretBlindIndexServiceFactoryDep = {
permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">; permissionService: Pick<TPermissionServiceFactory, "getProjectPermission">;
secretBlindIndexDAL: TSecretBlindIndexDALFactory; secretBlindIndexDAL: TSecretBlindIndexDALFactory;
secretDAL:Pick<TSecretDALFactory,'bulkUpdate'>; secretDAL: Pick<TSecretDALFactory, "bulkUpdate">;
}; };
export type TSecretBlindIndexServiceFactory = ReturnType<typeof secretBlindIndexServiceFactory>; export type TSecretBlindIndexServiceFactory = ReturnType<typeof secretBlindIndexServiceFactory>;
@@ -58,18 +58,28 @@ export const secretBlindIndexServiceFactory = ({
if (membership?.role !== ProjectMembershipRole.Admin) { if (membership?.role !== ProjectMembershipRole.Admin) {
throw new UnauthorizedError({ message: "User must be admin" }); throw new UnauthorizedError({ message: "User must be admin" });
} }
const blindIndexCfg = await secretBlindIndexDAL.findOne({ projectId }); const blindIndexCfg = await secretBlindIndexDAL.findOne({ projectId });
if (!blindIndexCfg) if (!blindIndexCfg)
throw new BadRequestError({ message: "Blind index not found", name: "CreateSecret" }); throw new BadRequestError({ message: "Blind index not found", name: "CreateSecret" });
const operations = await Promise.all(secretsToUpdate.map(async ({secretName,secretId:id})=>{ const secrets = await secretBlindIndexDAL.findSecretsByProjectId(
const secretBlindIndex = await generateSecretBlindIndexBySalt(secretName,blindIndexCfg); projectId,
return { filter:{id},data:{secretBlindIndex} } secretsToUpdate.map(({ secretId }) => secretId)
})) );
if (secrets.length !== secretsToUpdate.length)
throw new BadRequestError({ message: "Secret not found" });
await secretBlindIndexDAL.transaction(async(tx)=>{ const operations = await Promise.all(
await secretDAL.bulkUpdate(operations,tx) secretsToUpdate.map(async ({ secretName, secretId: id }) => {
}) const secretBlindIndex = await generateSecretBlindIndexBySalt(secretName, blindIndexCfg);
return { filter: { id }, data: { secretBlindIndex } };
})
);
await secretBlindIndexDAL.transaction(async (tx) => {
await secretDAL.bulkUpdate(operations, tx);
});
}; };
return { return {