22import json
33import os
44import subprocess
5+ import sys
56
67scriptPath = os .path .dirname (__file__ )
78outputPath = scriptPath # Optionally choose an alternative output path here.
@@ -19,6 +20,19 @@ def __init__(self, name, uuid, itemCount, created, updated):
1920# Get a list of vaults the logged-in user has access to
2021# Skips any Private vaults and the Metadata vault.
2122# Fetches all vault details and returns them as a Python object
23+ def getOwnerGroupUUID ():
24+ results = subprocess .run (
25+ ["op" , "group" , "get" , "Owners" , "--format=json" ],
26+ capture_output = True ,
27+ check = True ,
28+ )
29+ if results .returncode != 0 :
30+ sys .exit (
31+ "Unable to get the UUID of the Owners group. Ensure you are signed into 1Password and are a member of the Owners group."
32+ )
33+ return json .loads (results .stdout )["id" ]
34+
35+
2236def getVaults ():
2337 vaults = []
2438 try :
@@ -75,10 +89,32 @@ def identifyTrackedVault(vaultGroupName, vaults):
7589 return dataVault , trackedVault , otherVaults
7690
7791
92+ def getOwnerPermissions (vaultID , ownerID ):
93+ groupListResults = subprocess .run (
94+ [
95+ "op" ,
96+ "vault" ,
97+ "group" ,
98+ "list" ,
99+ f"{ vaultID } " ,
100+ "--format=json" ,
101+ ],
102+ capture_output = True ,
103+ )
104+ if groupListResults .returncode != 0 :
105+ print (
106+ f"\t ⚠️ Unable to get a list of groups with access to vault with UUID { vaultID } and cannot record Owner's permissions."
107+ )
108+ jsonData = json .loads (groupListResults .stdout )
109+ ownerDetails = [group for group in jsonData if group ["id" ] == ownerID ]
110+ ownerPermissions = "," .join (ownerDetails [0 ]["permissions" ])
111+ return ownerPermissions
112+
113+
78114def grantOwnerPermissions (vaultID ):
79115 ownerPermissions = "view_items,create_items,edit_items,archive_items,delete_items,view_and_copy_passwords,view_item_history,import_items,export_items,copy_and_share_items,print_items,manage_vault"
80116 print (f"\t Updating permissions on duplicate vault with UUID: { vaultID } " )
81- subprocess .run (
117+ results = subprocess .run (
82118 [
83119 "op" ,
84120 "vault" ,
@@ -91,6 +127,47 @@ def grantOwnerPermissions(vaultID):
91127 ],
92128 capture_output = True ,
93129 )
130+ if results .returncode != 0 :
131+ print (
132+ f"⚠️ Unable to set Owner permissions on vault with UUID: { vaultID } . Error: { results .stderr } "
133+ )
134+
135+
136+ def resetOwnerPermissions (trackedVault , ownerPermissions ):
137+ allPermissions = "view_items,create_items,edit_items,archive_items,delete_items,view_and_copy_passwords,view_item_history,import_items,export_items,copy_and_share_items,print_items,manage_vault"
138+ print (
139+ f"\t Resetting owner permissions on tracked vault with UUID: { trackedVault .uuid } "
140+ )
141+ subprocess .run (
142+ [
143+ "op" ,
144+ "vault" ,
145+ "group" ,
146+ "revoke" ,
147+ f"--vault={ trackedVault .uuid } " ,
148+ f"--group=Owners" ,
149+ f"--permissions={ allPermissions } " ,
150+ "--no-input" ,
151+ ],
152+ capture_output = True ,
153+ )
154+ results = subprocess .run (
155+ [
156+ "op" ,
157+ "vault" ,
158+ "group" ,
159+ "grant" ,
160+ f"--vault={ trackedVault .uuid } " ,
161+ f"--group=Owners" ,
162+ f"--permissions={ ownerPermissions } " ,
163+ "--no-input" ,
164+ ],
165+ capture_output = True ,
166+ )
167+ if results .returncode != 0 :
168+ print (
169+ f"⚠️ Unable to reset Owner permissions on vault with UUID: { trackedVault .uuid } . Error: { results .stderr } "
170+ )
94171
95172
96173def getVaultItems (vaultID ):
@@ -164,15 +241,13 @@ def revokeUntrackedVaultPermissions(untrackedVaults):
164241 allgroups = json .loads (
165242 subprocess .run (
166243 ["op" , "vault" , "group" , "list" , vault .uuid , "--format=json" ],
167- check = True ,
168244 capture_output = True ,
169245 text = True ,
170246 ).stdout
171247 )
172248 allUsers = json .loads (
173249 subprocess .run (
174250 ["op" , "vault" , "user" , "list" , vault .uuid , "--format=json" ],
175- check = True ,
176251 capture_output = True ,
177252 text = True ,
178253 ).stdout
@@ -222,6 +297,7 @@ def main():
222297 vaults = []
223298 vaultGroups = {}
224299 vaultDetails = getVaults ()
300+ ownerGroupUUID = getOwnerGroupUUID ()
225301
226302 for vault in vaultDetails :
227303 vaults .append (
@@ -247,6 +323,7 @@ def main():
247323 vaultGroups [vault .name ].append (vault )
248324
249325 for vaultGroupName , vaults in vaultGroups .items ():
326+ ownerPermissionsTracked = ""
250327 if len (vaults ) == 1 :
251328 print (
252329 f"Vault with name '{ vaultGroupName } ' is unique. Skipping de-duplication."
@@ -256,12 +333,13 @@ def main():
256333 print (
257334 f"\t Granting Owners group required permissions for vault named '{ vaultGroupName } '"
258335 )
259- for vault in vaults :
260- grantOwnerPermissions (vault .uuid )
261-
262336 trackedVault , dataVault , otherVaults = identifyTrackedVault (
263337 vaultGroupName , vaults
264338 )
339+ ownerPermissionsTracked = getOwnerPermissions (trackedVault .uuid , ownerGroupUUID )
340+ for vault in vaults :
341+ grantOwnerPermissions (vault .uuid )
342+
265343 otherVaultNames = "none"
266344 if len (otherVaults ) > 0 :
267345 otherVaultNames = ""
@@ -275,6 +353,7 @@ def main():
275353 untrackedVaults = otherVaults
276354 untrackedVaults .append (dataVault )
277355 renameUntrackedVaults (untrackedVaults )
356+ resetOwnerPermissions (trackedVault , ownerPermissionsTracked )
278357 revokeUntrackedVaultPermissions (untrackedVaults )
279358
280359
0 commit comments