Skip to content

Commit 9d28b21

Browse files
authored
Merge pull request #54 from 1Password/sl/fix/manage-owner-permissions
Sl/fix/manage owner permissions
2 parents f670618 + 919a81d commit 9d28b21

File tree

1 file changed

+85
-6
lines changed

1 file changed

+85
-6
lines changed

migration/cleanup-scripts/move_items_to_tracked_vault.py

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import os
44
import subprocess
5+
import sys
56

67
scriptPath = os.path.dirname(__file__)
78
outputPath = 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+
2236
def 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+
78114
def 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"\tUpdating 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"\tResetting 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

96173
def 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"\tGranting 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

Comments
 (0)