@@ -262,6 +262,97 @@ describe("secrets", () => {
262262 } ) ;
263263 } ) ;
264264
265+ describe ( "revokeSecretAccess" , ( ) => {
266+ const secret = {
267+ name : "secret" ,
268+ projectId : "projectId" ,
269+ } ;
270+
271+ it ( "should revoke access from the appropriate service accounts" , async ( ) => {
272+ gcsm . getIamPolicy . resolves ( {
273+ version : 1 ,
274+ etag : "tag" ,
275+ bindings : [
276+ {
277+ role : "roles/viewer" ,
278+ members : [ "serviceAccount:existingSA" ] ,
279+ } ,
280+ {
281+ role : "roles/secretmanager.secretAccessor" ,
282+ members : [
283+ "serviceAccount:buildSA" ,
284+ "serviceAccount:computeSA" ,
285+ "serviceAccount:otherSA" ,
286+ ] ,
287+ } ,
288+ {
289+ role : "roles/secretmanager.secretAccessor" ,
290+ members : [ "serviceAccount:buildSA" ] ,
291+ } ,
292+ {
293+ role : "roles/secretmanager.viewer" ,
294+ members : [ "serviceAccount:buildSA" , "serviceAccount:otherBuildSA" ] ,
295+ } ,
296+ {
297+ role : "roles/secretmanager.secretVersionManager" ,
298+ members : [
299+ "serviceAccount:service-12345@gcp-sa-firebaseapphosting.iam.gserviceaccount.com" ,
300+ ] ,
301+ } ,
302+ ] ,
303+ } ) ;
304+ gcsm . setIamPolicy . resolves ( ) ;
305+
306+ await secrets . revokeSecretAccess ( secret . projectId , secret . name , {
307+ buildServiceAccounts : [ "buildSA" ] ,
308+ runServiceAccounts : [ "computeSA" ] ,
309+ } ) ;
310+
311+ expect ( gcsm . getIamPolicy ) . to . be . calledWithMatch ( secret ) ;
312+ expect ( gcsm . setIamPolicy ) . to . be . calledWithMatch ( secret , [
313+ {
314+ role : "roles/viewer" ,
315+ members : [ "serviceAccount:existingSA" ] ,
316+ } ,
317+ {
318+ role : "roles/secretmanager.secretAccessor" ,
319+ members : [ "serviceAccount:otherSA" ] ,
320+ } ,
321+ {
322+ role : "roles/secretmanager.viewer" ,
323+ members : [ "serviceAccount:otherBuildSA" ] ,
324+ } ,
325+ {
326+ role : "roles/secretmanager.secretVersionManager" ,
327+ members : [
328+ "serviceAccount:service-12345@gcp-sa-firebaseapphosting.iam.gserviceaccount.com" ,
329+ ] ,
330+ } ,
331+ ] ) ;
332+ } ) ;
333+
334+ it ( "should not set IAM policy if no matching bindings exist" , async ( ) => {
335+ gcsm . getIamPolicy . resolves ( {
336+ version : 1 ,
337+ etag : "tag" ,
338+ bindings : [
339+ {
340+ role : "roles/secretmanager.secretAccessor" ,
341+ members : [ "serviceAccount:otherSA" ] ,
342+ } ,
343+ ] ,
344+ } ) ;
345+
346+ await secrets . revokeSecretAccess ( secret . projectId , secret . name , {
347+ buildServiceAccounts : [ "buildSA" ] ,
348+ runServiceAccounts : [ "computeSA" ] ,
349+ } ) ;
350+
351+ expect ( gcsm . getIamPolicy ) . to . be . calledWithMatch ( secret ) ;
352+ expect ( gcsm . setIamPolicy ) . to . not . have . been . called ;
353+ } ) ;
354+ } ) ;
355+
265356 describe ( "grantEmailsSecretAccess" , ( ) => {
266357 const secret = {
267358 projectId : "projectId" ,
@@ -384,6 +475,53 @@ describe("secrets", () => {
384475 } ) ;
385476 } ) ;
386477
478+ describe ( "revokeEmailsSecretAccess" , ( ) => {
479+ const secret = {
480+ projectId : "projectId" ,
481+ name : "secret" ,
482+ } ;
483+
484+ it ( "should revoke user and group access to secrets" , async ( ) => {
485+ gcsm . getIamPolicy . resolves ( {
486+ version : 1 ,
487+ etag : "tag" ,
488+ bindings : [
489+ {
490+ role : "roles/viewer" ,
491+ members : [ "serviceAccount:existingSA" ] ,
492+ } ,
493+ {
494+ role : "roles/secretmanager.secretAccessor" ,
495+ members : [
496+ "user:user@mydomain.com" ,
497+ "group:mygroup@mydomain.com" ,
498+ "serviceAccount:buildSA" ,
499+ ] ,
500+ } ,
501+ ] ,
502+ } ) ;
503+ gcsm . setIamPolicy . resolves ( ) ;
504+
505+ await secrets . revokeEmailsSecretAccess (
506+ secret . projectId ,
507+ [ secret . name ] ,
508+ [ "user@mydomain.com" , "mygroup@mydomain.com" ] ,
509+ ) ;
510+
511+ expect ( gcsm . getIamPolicy ) . to . be . calledWithMatch ( secret ) ;
512+ expect ( gcsm . setIamPolicy ) . to . be . calledWithMatch ( secret , [
513+ {
514+ role : "roles/viewer" ,
515+ members : [ "serviceAccount:existingSA" ] ,
516+ } ,
517+ {
518+ role : "roles/secretmanager.secretAccessor" ,
519+ members : [ "serviceAccount:buildSA" ] ,
520+ } ,
521+ ] ) ;
522+ } ) ;
523+ } ) ;
524+
387525 describe ( "fetchSecrets" , ( ) => {
388526 const projectId = "randomProject" ;
389527 it ( "correctly attempts to fetch secret and it's version" , async ( ) => {
0 commit comments