@@ -2,8 +2,8 @@ import to from 'await-to-js';
2
2
import { Types } from 'mongoose' ;
3
3
import { Request , Response } from 'express' ;
4
4
import { ISecret , Secret } from '../../models' ;
5
- import {
6
- SECRET_PERSONAL ,
5
+ import {
6
+ SECRET_PERSONAL ,
7
7
SECRET_SHARED ,
8
8
ACTION_ADD_SECRETS ,
9
9
ACTION_READ_SECRETS ,
@@ -23,9 +23,9 @@ import { BadRequestError } from '../../utils/errors';
23
23
* @param res
24
24
*/
25
25
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' ;
27
27
const { workspaceId, environment } = req . body ;
28
-
28
+
29
29
let toAdd ;
30
30
if ( Array . isArray ( req . body . secrets ) ) {
31
31
// case: create multiple secrets
@@ -34,7 +34,7 @@ export const createSecrets = async (req: Request, res: Response) => {
34
34
// case: create 1 secret
35
35
toAdd = [ req . body . secrets ] ;
36
36
}
37
-
37
+
38
38
const newSecrets = await Secret . insertMany (
39
39
toAdd . map ( ( {
40
40
type,
@@ -66,7 +66,7 @@ export const createSecrets = async (req: Request, res: Response) => {
66
66
secretValueTag
67
67
} ) )
68
68
) ;
69
-
69
+
70
70
// (EE) add secret versions for new secrets
71
71
EESecretService . addSecretVersions ( {
72
72
secretVersions : newSecrets . map ( ( {
@@ -160,7 +160,7 @@ export const createSecrets = async (req: Request, res: Response) => {
160
160
*/
161
161
export const getSecrets = async ( req : Request , res : Response ) => {
162
162
const { workspaceId, environment } = req . query ;
163
-
163
+
164
164
let userId : Types . ObjectId | undefined = undefined // used for getting personal secrets for user
165
165
if ( req . user ) {
166
166
userId = req . user . _id ;
@@ -169,23 +169,23 @@ export const getSecrets = async (req: Request, res: Response) => {
169
169
if ( req . serviceTokenData ) {
170
170
userId = req . serviceTokenData . user . _id
171
171
}
172
-
172
+
173
173
const [ err , secrets ] = await to ( Secret . find (
174
174
{
175
175
workspace : workspaceId ,
176
176
environment,
177
177
$or : [
178
- { user : userId } ,
178
+ { user : userId } ,
179
179
{ user : { $exists : false } }
180
180
] ,
181
181
type : { $in : [ SECRET_SHARED , SECRET_PERSONAL ] }
182
182
}
183
183
) . then ( ) )
184
184
185
185
if ( err ) throw ValidationError ( { message : 'Failed to get secrets' , stack : err . stack } ) ;
186
-
186
+
187
187
const channel = req . headers ?. [ 'user-agent' ] ?. toLowerCase ( ) . includes ( 'mozilla' ) ? 'web' : 'cli' ;
188
-
188
+
189
189
const readAction = await EELogService . createActionSecret ( {
190
190
name : ACTION_READ_SECRETS ,
191
191
userId : req . user . _id . toString ( ) ,
@@ -214,7 +214,7 @@ export const getSecrets = async (req: Request, res: Response) => {
214
214
}
215
215
} ) ;
216
216
}
217
-
217
+
218
218
return res . status ( 200 ) . send ( {
219
219
secrets
220
220
} ) ;
@@ -226,8 +226,8 @@ export const getSecrets = async (req: Request, res: Response) => {
226
226
* @param res
227
227
*/
228
228
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
+
231
231
// TODO: move type
232
232
interface PatchSecret {
233
233
id : string ;
@@ -242,7 +242,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
242
242
secretCommentTag : string ;
243
243
}
244
244
245
- const ops = req . body . secrets . map ( ( secret : PatchSecret ) => {
245
+ const updateOperationsToPerform = req . body . secrets . map ( ( secret : PatchSecret ) => {
246
246
const {
247
247
secretKeyCiphertext,
248
248
secretKeyIV,
@@ -254,6 +254,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
254
254
secretCommentIV,
255
255
secretCommentTag
256
256
} = secret ;
257
+
257
258
return ( {
258
259
updateOne : {
259
260
filter : { _id : new Types . ObjectId ( secret . id ) } ,
@@ -268,8 +269,8 @@ export const updateSecrets = async (req: Request, res: Response) => {
268
269
secretValueIV,
269
270
secretValueTag,
270
271
...( (
271
- secretCommentCiphertext &&
272
- secretCommentIV &&
272
+ secretCommentCiphertext &&
273
+ secretCommentIV &&
273
274
secretCommentTag
274
275
) ? {
275
276
secretCommentCiphertext,
@@ -280,15 +281,17 @@ export const updateSecrets = async (req: Request, res: Response) => {
280
281
}
281
282
} ) ;
282
283
} ) ;
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 } = { } ;
286
288
req . body . secrets . forEach ( ( secret : PatchSecret ) => {
287
- newSecretsObj [ secret . id ] = secret ;
289
+ secretModificationsBySecretId [ secret . id ] = secret ;
288
290
} ) ;
289
291
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 ) => {
292
295
const {
293
296
secretKeyCiphertext,
294
297
secretKeyIV,
@@ -298,37 +301,29 @@ export const updateSecrets = async (req: Request, res: Response) => {
298
301
secretValueTag,
299
302
secretCommentCiphertext,
300
303
secretCommentIV,
301
- secretCommentTag
302
- } = newSecretsObj [ secret . _id . toString ( ) ]
304
+ secretCommentTag,
305
+ } = secretModificationsBySecretId [ secret . _id . toString ( ) ]
306
+
303
307
return ( {
304
308
secret : secret . _id ,
305
309
version : secret . version + 1 ,
306
310
workspace : secret . workspace ,
307
311
type : secret . type ,
308
312
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 ,
329
322
} ) ;
330
323
} )
331
- } ) ;
324
+ }
325
+
326
+ await EESecretService . addSecretVersions ( secretVersions ) ;
332
327
333
328
334
329
// group secrets into workspaces so updated secrets can
@@ -355,7 +350,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
355
350
userId : req . user . _id . toString ( ) ,
356
351
workspaceId : key ,
357
352
secretIds : workspaceSecretObj [ key ] . map ( ( secret : ISecret ) => secret . _id )
358
- } ) ;
353
+ } ) ;
359
354
360
355
// (EE) create (audit) log
361
356
updateAction && await EELogService . createLog ( {
@@ -367,9 +362,9 @@ export const updateSecrets = async (req: Request, res: Response) => {
367
362
} ) ;
368
363
369
364
// (EE) take a secret snapshot
370
- await EESecretService . takeSecretSnapshot ( {
371
- workspaceId : key
372
- } )
365
+ await EESecretService . takeSecretSnapshot ( {
366
+ workspaceId : key
367
+ } )
373
368
374
369
if ( postHogClient ) {
375
370
postHogClient . capture ( {
@@ -385,7 +380,7 @@ export const updateSecrets = async (req: Request, res: Response) => {
385
380
} ) ;
386
381
}
387
382
} ) ;
388
-
383
+
389
384
return res . status ( 200 ) . send ( {
390
385
secrets : await Secret . find ( {
391
386
_id : {
@@ -401,15 +396,15 @@ export const updateSecrets = async (req: Request, res: Response) => {
401
396
* @param res
402
397
*/
403
398
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' ;
405
400
const toDelete = req . secrets . map ( ( s : any ) => s . _id ) ;
406
-
401
+
407
402
await Secret . deleteMany ( {
408
403
_id : {
409
404
$in : toDelete
410
405
}
411
406
} ) ;
412
-
407
+
413
408
await EESecretService . markDeletedSecretVersions ( {
414
409
secretIds : toDelete
415
410
} ) ;
@@ -437,7 +432,7 @@ export const deleteSecrets = async (req: Request, res: Response) => {
437
432
userId : req . user . _id . toString ( ) ,
438
433
workspaceId : key ,
439
434
secretIds : workspaceSecretObj [ key ] . map ( ( secret : ISecret ) => secret . _id )
440
- } ) ;
435
+ } ) ;
441
436
442
437
// (EE) create (audit) log
443
438
deleteAction && await EELogService . createLog ( {
@@ -449,9 +444,9 @@ export const deleteSecrets = async (req: Request, res: Response) => {
449
444
} ) ;
450
445
451
446
// (EE) take a secret snapshot
452
- await EESecretService . takeSecretSnapshot ( {
453
- workspaceId : key
454
- } )
447
+ await EESecretService . takeSecretSnapshot ( {
448
+ workspaceId : key
449
+ } )
455
450
456
451
if ( postHogClient ) {
457
452
postHogClient . capture ( {
@@ -467,7 +462,7 @@ export const deleteSecrets = async (req: Request, res: Response) => {
467
462
} ) ;
468
463
}
469
464
} ) ;
470
-
465
+
471
466
return res . status ( 200 ) . send ( {
472
467
secrets : req . secrets
473
468
} ) ;
0 commit comments