Skip to content

Commit 71f60f1

Browse files
committed
Update modify secrets api v2 so that fields are optional
1 parent 47fd48b commit 71f60f1

File tree

4 files changed

+141
-158
lines changed

4 files changed

+141
-158
lines changed

backend/src/controllers/v2/secretsController.ts

+54-59
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import to from 'await-to-js';
22
import { Types } from 'mongoose';
33
import { Request, Response } from 'express';
44
import { ISecret, Secret } from '../../models';
5-
import {
6-
SECRET_PERSONAL,
5+
import {
6+
SECRET_PERSONAL,
77
SECRET_SHARED,
88
ACTION_ADD_SECRETS,
99
ACTION_READ_SECRETS,
@@ -23,9 +23,9 @@ import { BadRequestError } from '../../utils/errors';
2323
* @param res
2424
*/
2525
export const createSecrets = async (req: Request, res: Response) => {
26-
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
26+
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
2727
const { workspaceId, environment } = req.body;
28-
28+
2929
let toAdd;
3030
if (Array.isArray(req.body.secrets)) {
3131
// case: create multiple secrets
@@ -34,7 +34,7 @@ export const createSecrets = async (req: Request, res: Response) => {
3434
// case: create 1 secret
3535
toAdd = [req.body.secrets];
3636
}
37-
37+
3838
const newSecrets = await Secret.insertMany(
3939
toAdd.map(({
4040
type,
@@ -66,7 +66,7 @@ export const createSecrets = async (req: Request, res: Response) => {
6666
secretValueTag
6767
}))
6868
);
69-
69+
7070
// (EE) add secret versions for new secrets
7171
EESecretService.addSecretVersions({
7272
secretVersions: newSecrets.map(({
@@ -160,7 +160,7 @@ export const createSecrets = async (req: Request, res: Response) => {
160160
*/
161161
export const getSecrets = async (req: Request, res: Response) => {
162162
const { workspaceId, environment } = req.query;
163-
163+
164164
let userId: Types.ObjectId | undefined = undefined // used for getting personal secrets for user
165165
if (req.user) {
166166
userId = req.user._id;
@@ -169,23 +169,23 @@ export const getSecrets = async (req: Request, res: Response) => {
169169
if (req.serviceTokenData) {
170170
userId = req.serviceTokenData.user._id
171171
}
172-
172+
173173
const [err, secrets] = await to(Secret.find(
174174
{
175175
workspace: workspaceId,
176176
environment,
177177
$or: [
178-
{ user: userId },
178+
{ user: userId },
179179
{ user: { $exists: false } }
180180
],
181181
type: { $in: [SECRET_SHARED, SECRET_PERSONAL] }
182182
}
183183
).then())
184184

185185
if (err) throw ValidationError({ message: 'Failed to get secrets', stack: err.stack });
186-
186+
187187
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
188-
188+
189189
const readAction = await EELogService.createActionSecret({
190190
name: ACTION_READ_SECRETS,
191191
userId: req.user._id.toString(),
@@ -214,7 +214,7 @@ export const getSecrets = async (req: Request, res: Response) => {
214214
}
215215
});
216216
}
217-
217+
218218
return res.status(200).send({
219219
secrets
220220
});
@@ -226,8 +226,8 @@ export const getSecrets = async (req: Request, res: Response) => {
226226
* @param res
227227
*/
228228
export const updateSecrets = async (req: Request, res: Response) => {
229-
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
230-
229+
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
230+
231231
// TODO: move type
232232
interface PatchSecret {
233233
id: string;
@@ -242,7 +242,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
242242
secretCommentTag: string;
243243
}
244244

245-
const ops = req.body.secrets.map((secret: PatchSecret) => {
245+
const updateOperationsToPerform = req.body.secrets.map((secret: PatchSecret) => {
246246
const {
247247
secretKeyCiphertext,
248248
secretKeyIV,
@@ -254,6 +254,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
254254
secretCommentIV,
255255
secretCommentTag
256256
} = secret;
257+
257258
return ({
258259
updateOne: {
259260
filter: { _id: new Types.ObjectId(secret.id) },
@@ -268,8 +269,8 @@ export const updateSecrets = async (req: Request, res: Response) => {
268269
secretValueIV,
269270
secretValueTag,
270271
...((
271-
secretCommentCiphertext &&
272-
secretCommentIV &&
272+
secretCommentCiphertext &&
273+
secretCommentIV &&
273274
secretCommentTag
274275
) ? {
275276
secretCommentCiphertext,
@@ -280,15 +281,17 @@ export const updateSecrets = async (req: Request, res: Response) => {
280281
}
281282
});
282283
});
283-
await Secret.bulkWrite(ops);
284-
285-
const newSecretsObj: { [key: string]: PatchSecret } = {};
284+
285+
await Secret.bulkWrite(updateOperationsToPerform);
286+
287+
const secretModificationsBySecretId: { [key: string]: PatchSecret } = {};
286288
req.body.secrets.forEach((secret: PatchSecret) => {
287-
newSecretsObj[secret.id] = secret;
289+
secretModificationsBySecretId[secret.id] = secret;
288290
});
289291

290-
await EESecretService.addSecretVersions({
291-
secretVersions: req.secrets.map((secret: ISecret) => {
292+
const ListOfSecretsBeforeModifications = req.secrets
293+
const secretVersions = {
294+
secretVersions: ListOfSecretsBeforeModifications.map((secret: ISecret) => {
292295
const {
293296
secretKeyCiphertext,
294297
secretKeyIV,
@@ -298,37 +301,29 @@ export const updateSecrets = async (req: Request, res: Response) => {
298301
secretValueTag,
299302
secretCommentCiphertext,
300303
secretCommentIV,
301-
secretCommentTag
302-
} = newSecretsObj[secret._id.toString()]
304+
secretCommentTag,
305+
} = secretModificationsBySecretId[secret._id.toString()]
306+
303307
return ({
304308
secret: secret._id,
305309
version: secret.version + 1,
306310
workspace: secret.workspace,
307311
type: secret.type,
308312
environment: secret.environment,
309-
isDeleted: false,
310-
secretKeyCiphertext,
311-
secretKeyIV,
312-
secretKeyTag,
313-
secretValueCiphertext,
314-
secretValueIV,
315-
secretValueTag,
316-
...((
317-
secretCommentCiphertext &&
318-
secretCommentIV &&
319-
secretCommentTag
320-
) ? {
321-
secretCommentCiphertext,
322-
secretCommentIV,
323-
secretCommentTag
324-
} : {
325-
secretCommentCiphertext: '',
326-
secretCommentIV: '',
327-
secretCommentTag: ''
328-
})
313+
secretKeyCiphertext: secretKeyCiphertext ? secretKeyCiphertext : secret.secretKeyCiphertext,
314+
secretKeyIV: secretKeyIV ? secretKeyIV : secret.secretKeyIV,
315+
secretKeyTag: secretKeyTag ? secretKeyTag : secret.secretKeyTag,
316+
secretValueCiphertext: secretValueCiphertext ? secretValueCiphertext : secret.secretValueCiphertext,
317+
secretValueIV: secretValueIV ? secretValueIV : secret.secretValueIV,
318+
secretValueTag: secretValueTag ? secretValueTag : secret.secretValueTag,
319+
secretCommentCiphertext: secretCommentCiphertext ? secretCommentCiphertext : secret.secretCommentCiphertext,
320+
secretCommentIV: secretCommentIV ? secretCommentIV : secret.secretCommentIV,
321+
secretCommentTag: secretCommentTag ? secretCommentTag : secret.secretCommentTag,
329322
});
330323
})
331-
});
324+
}
325+
326+
await EESecretService.addSecretVersions(secretVersions);
332327

333328

334329
// group secrets into workspaces so updated secrets can
@@ -355,7 +350,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
355350
userId: req.user._id.toString(),
356351
workspaceId: key,
357352
secretIds: workspaceSecretObj[key].map((secret: ISecret) => secret._id)
358-
});
353+
});
359354

360355
// (EE) create (audit) log
361356
updateAction && await EELogService.createLog({
@@ -367,9 +362,9 @@ export const updateSecrets = async (req: Request, res: Response) => {
367362
});
368363

369364
// (EE) take a secret snapshot
370-
await EESecretService.takeSecretSnapshot({
371-
workspaceId: key
372-
})
365+
await EESecretService.takeSecretSnapshot({
366+
workspaceId: key
367+
})
373368

374369
if (postHogClient) {
375370
postHogClient.capture({
@@ -385,7 +380,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
385380
});
386381
}
387382
});
388-
383+
389384
return res.status(200).send({
390385
secrets: await Secret.find({
391386
_id: {
@@ -401,15 +396,15 @@ export const updateSecrets = async (req: Request, res: Response) => {
401396
* @param res
402397
*/
403398
export const deleteSecrets = async (req: Request, res: Response) => {
404-
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
399+
const channel = req.headers?.['user-agent']?.toLowerCase().includes('mozilla') ? 'web' : 'cli';
405400
const toDelete = req.secrets.map((s: any) => s._id);
406-
401+
407402
await Secret.deleteMany({
408403
_id: {
409404
$in: toDelete
410405
}
411406
});
412-
407+
413408
await EESecretService.markDeletedSecretVersions({
414409
secretIds: toDelete
415410
});
@@ -437,7 +432,7 @@ export const deleteSecrets = async (req: Request, res: Response) => {
437432
userId: req.user._id.toString(),
438433
workspaceId: key,
439434
secretIds: workspaceSecretObj[key].map((secret: ISecret) => secret._id)
440-
});
435+
});
441436

442437
// (EE) create (audit) log
443438
deleteAction && await EELogService.createLog({
@@ -449,9 +444,9 @@ export const deleteSecrets = async (req: Request, res: Response) => {
449444
});
450445

451446
// (EE) take a secret snapshot
452-
await EESecretService.takeSecretSnapshot({
453-
workspaceId: key
454-
})
447+
await EESecretService.takeSecretSnapshot({
448+
workspaceId: key
449+
})
455450

456451
if (postHogClient) {
457452
postHogClient.capture({
@@ -467,7 +462,7 @@ export const deleteSecrets = async (req: Request, res: Response) => {
467462
});
468463
}
469464
});
470-
465+
471466
return res.status(200).send({
472467
secrets: req.secrets
473468
});

0 commit comments

Comments
 (0)