gam7 7.23.4__py3-none-any.whl → 7.23.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

gam/__init__.py CHANGED
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.23.04'
28
+ __version__ = '7.23.06'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -16990,21 +16990,38 @@ def doDeleteAdmin():
16990
16990
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
16991
16991
  ClientAPIAccessDeniedExit(str(e))
16992
16992
 
16993
- ASSIGNEE_EMAILTYPE_TOFIELD_MAP = {
16993
+ ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP = {
16994
16994
  'user': 'assignedToUser',
16995
16995
  'group': 'assignedToGroup',
16996
16996
  'serviceaccount': 'assignedToServiceAccount',
16997
+ 'unknown': 'assignedToUnknown',
16997
16998
  }
16998
- PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId']
16999
+ ALL_ASSIGNEE_TYPES = ['user', 'group', 'serviceaccount']
17000
+
17001
+ PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId', 'assigneeType']
16999
17002
  PRINT_ADMIN_TITLES = ['roleAssignmentId', 'roleId', 'role',
17000
17003
  'assignedTo', 'assignedToUser', 'assignedToGroup', 'assignedToServiceAccount', 'assignedToUnknown',
17001
17004
  'scopeType', 'orgUnitId', 'orgUnit']
17002
17005
 
17006
+ def getAssigneeTypes(myarg, typesSet):
17007
+ if myarg in {'type', 'types'}:
17008
+ for gtype in getString(Cmd.OB_ADMIN_ASSIGNEE_TYPE_LIST).lower().replace(',', ' ').split():
17009
+ if gtype in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17010
+ typesSet.add(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[gtype])
17011
+ else:
17012
+ invalidChoiceExit(gtype, ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP, True)
17013
+ else:
17014
+ return False
17015
+ return True
17016
+
17003
17017
  # gam print admins [todrive <ToDriveAttribute>*]
17004
- # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition]
17005
- # [privileges] [oneitemperrow]
17018
+ # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
17019
+ # [types <AdminAssigneeTypeList>]
17020
+ # [recursive] [condition] [privileges] [oneitemperrow]
17006
17021
  # gam show admins
17007
- # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition] [privileges]
17022
+ # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
17023
+ # [types <AdminAssigneeTypeList>]
17024
+ # [recursive] [condition] [privileges]
17008
17025
  def doPrintShowAdmins():
17009
17026
  def _getPrivileges(admin):
17010
17027
  if showPrivileges:
@@ -17031,19 +17048,18 @@ def doPrintShowAdmins():
17031
17048
  def _setNamesFromIds(admin, privileges):
17032
17049
  admin['role'] = role_from_roleid(admin['roleId'])
17033
17050
  assignedTo = admin['assignedTo']
17034
- admin['assignedToUnknown'] = False
17035
17051
  if assignedTo not in assignedToIdEmailMap:
17036
- assigneeType = admin.get('assigneeType')
17037
- assignedToField = ASSIGNEE_EMAILTYPE_TOFIELD_MAP.get(assigneeType, None)
17038
17052
  assigneeEmail, assigneeType = convertUIDtoEmailAddressWithType(f'uid:{assignedTo}', cd, sal,
17039
- emailTypes=list(ASSIGNEE_EMAILTYPE_TOFIELD_MAP.keys()))
17040
- if not assignedToField and assigneeType in ASSIGNEE_EMAILTYPE_TOFIELD_MAP:
17041
- assignedToField = ASSIGNEE_EMAILTYPE_TOFIELD_MAP[assigneeType]
17042
- if assigneeType == 'unknown':
17053
+ emailTypes=ALL_ASSIGNEE_TYPES if admin.get('assigneeType') != 'group' else ['group'])
17054
+ if assigneeType in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17055
+ assignedToField = ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[assigneeType]
17056
+ else:
17043
17057
  assignedToField = 'assignedToUnknown'
17058
+ if assignedToField == 'assignedToUnknown':
17044
17059
  assigneeEmail = True
17045
17060
  assignedToIdEmailMap[assignedTo] = {'assignedToField': assignedToField, 'assigneeEmail': assigneeEmail}
17046
17061
  admin[assignedToIdEmailMap[assignedTo]['assignedToField']] = assignedToIdEmailMap[assignedTo]['assigneeEmail']
17062
+ admin['assignedToField'] = assignedToIdEmailMap[assignedTo]['assignedToField']
17047
17063
  if privileges is not None:
17048
17064
  admin.update(privileges)
17049
17065
  if 'orgUnitId' in admin:
@@ -17059,7 +17075,8 @@ def doPrintShowAdmins():
17059
17075
  csvPF = CSVPrintFile(PRINT_ADMIN_TITLES) if Act.csvFormat() else None
17060
17076
  roleId = None
17061
17077
  userKey = None
17062
- oneItemPerRow = showPrivileges = False
17078
+ oneItemPerRow = recursive = showPrivileges = False
17079
+ typesSet = set()
17063
17080
  kwargs = {}
17064
17081
  rolePrivileges = {}
17065
17082
  fieldsList = PRINT_ADMIN_FIELDS
@@ -17072,6 +17089,17 @@ def doPrintShowAdmins():
17072
17089
  userKey = kwargs['userKey'] = getEmailAddress()
17073
17090
  elif myarg == 'role':
17074
17091
  _, roleId = getRoleId()
17092
+ elif getAssigneeTypes(myarg, typesSet):
17093
+ pass
17094
+ elif myarg == 'recursive':
17095
+ recursive = True
17096
+ allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17097
+ memberOptions = initMemberOptions()
17098
+ memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP] = True
17099
+ memberOptions[MEMBEROPTION_DISPLAYMATCH] = False
17100
+ memberDisplayOptions = initIPSGMGroupMemberDisplayOptions()
17101
+ for role in [Ent.ROLE_MEMBER, Ent.ROLE_MANAGER, Ent.ROLE_OWNER]:
17102
+ memberDisplayOptions[role]['show'] = True
17075
17103
  elif myarg == 'condition':
17076
17104
  fieldsList.append('condition')
17077
17105
  if csvPF:
@@ -17085,13 +17113,15 @@ def doPrintShowAdmins():
17085
17113
  if roleId and not kwargs:
17086
17114
  kwargs['roleId'] = roleId
17087
17115
  roleId = None
17116
+ if not typesSet:
17117
+ typesSet = set(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP.values())
17088
17118
  fields = getItemFieldsFromFieldsList('items', fieldsList)
17089
17119
  printGettingAllAccountEntities(Ent.ADMIN_ROLE_ASSIGNMENT)
17090
17120
  try:
17091
17121
  admins = callGAPIpages(cd.roleAssignments(), 'list', 'items',
17092
17122
  pageMessage=getPageMessage(),
17093
17123
  throwReasons=[GAPI.INVALID, GAPI.USER_NOT_FOUND,
17094
- GAPI.FORBIDDEN, GAPI.SERVICE_NOT_AVAILABLE,
17124
+ GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.SERVICE_NOT_AVAILABLE,
17095
17125
  GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND,
17096
17126
  GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
17097
17127
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
@@ -17099,39 +17129,77 @@ def doPrintShowAdmins():
17099
17129
  except (GAPI.invalid, GAPI.userNotFound):
17100
17130
  entityUnknownWarning(Ent.ADMINISTRATOR, userKey)
17101
17131
  return
17102
- except (GAPI.serviceNotAvailable) as e:
17103
- entityActionFailedExit([Ent.ADMINISTRATOR, userKey, Ent.ADMIN_ROLE, roleId], str(e))
17132
+ except GAPI.notFound as e:
17133
+ entityActionFailedExit([Ent.ADMIN_ROLE, kwargs['roleId']], str(e))
17134
+ except (GAPI.forbidden, GAPI.serviceNotAvailable) as e:
17135
+ entityActionFailedExit([Ent.ADMINISTRATOR, userKey], str(e))
17104
17136
  except (GAPI.badRequest, GAPI.customerNotFound):
17105
17137
  accessErrorExit(cd)
17106
17138
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
17107
17139
  ClientAPIAccessDeniedExit(str(e))
17140
+ count = len(admins)
17141
+ groupMembers = {}
17142
+ expandedAdmins = []
17143
+ i = 0
17144
+ for admin in admins:
17145
+ i += 1
17146
+ if roleId and roleId != admin['roleId']:
17147
+ continue
17148
+ assignedTo = admin['assignedTo']
17149
+ if admin['assigneeType'] != 'group' or not recursive:
17150
+ _setNamesFromIds(admin, _getPrivileges(admin))
17151
+ if admin['assignedToField'] in typesSet:
17152
+ expandedAdmins.append(admin)
17153
+ continue
17154
+ if assignedTo not in groupMembers:
17155
+ membersList = []
17156
+ membersSet = set()
17157
+ level = 0
17158
+ getGroupMembers(cd, assignedTo, allGroupRoles, membersList, membersSet, i, count,
17159
+ memberOptions, memberDisplayOptions, level, {Ent.TYPE_USER})
17160
+ groupMembers[assignedTo] = membersList[:]
17161
+ _setNamesFromIds(admin, _getPrivileges(admin))
17162
+ if admin[assignedToIdEmailMap[assignedTo]['assignedToField']] not in typesSet:
17163
+ continue
17164
+ expandedAdmins.append(admin)
17165
+ if not groupMembers[assignedTo]:
17166
+ expandedAdmins.append(admin)
17167
+ continue
17168
+ admin['assigneeType'] = 'user'
17169
+ admin['assignedToGroup'] = assignedToIdEmailMap[assignedTo]['assigneeEmail']
17170
+ for member in groupMembers[assignedTo]:
17171
+ userAdmin = admin.copy()
17172
+ userAdmin['assignedTo'] = member['id']
17173
+ _setNamesFromIds(userAdmin, _getPrivileges(admin))
17174
+ expandedAdmins.append(userAdmin)
17175
+ admins = expandedAdmins
17176
+ count = len(expandedAdmins)
17108
17177
  if not csvPF:
17109
- count = len(admins)
17110
17178
  performActionNumItems(count, Ent.ADMIN_ROLE_ASSIGNMENT)
17111
17179
  Ind.Increment()
17112
17180
  i = 0
17113
- for admin in admins:
17181
+ for admin in expandedAdmins:
17114
17182
  i += 1
17115
- if roleId and roleId != admin['roleId']:
17116
- continue
17117
- _setNamesFromIds(admin, _getPrivileges(admin))
17118
17183
  printEntity([Ent.ADMIN_ROLE_ASSIGNMENT, admin['roleAssignmentId']], i, count)
17119
17184
  Ind.Increment()
17120
17185
  for field in PRINT_ADMIN_TITLES:
17121
17186
  if field in admin:
17122
17187
  if field == 'roleAssignmentId':
17123
17188
  continue
17124
- if field != 'rolePrivileges':
17125
- printKeyValueList([field, admin[field]])
17126
- else:
17127
- showJSON(None, admin[field])
17189
+ printKeyValueList([field, admin[field]])
17190
+ if showPrivileges:
17191
+ rolePrivileges = admin.get('rolePrivileges', [])
17192
+ jcount = len(rolePrivileges)
17193
+ if jcount > 0:
17194
+ printKeyValueList(['rolePrivileges', jcount])
17195
+ Ind.Increment()
17196
+ showJSON(None, rolePrivileges)
17197
+ Ind.Decrement()
17128
17198
  Ind.Decrement()
17129
17199
  Ind.Decrement()
17130
17200
  else:
17131
- for admin in admins:
17132
- if roleId and roleId != admin['roleId']:
17133
- continue
17134
- _setNamesFromIds(admin, _getPrivileges(admin))
17201
+ for admin in expandedAdmins:
17202
+ admin.pop('assignedToField')
17135
17203
  if not oneItemPerRow or 'rolePrivileges' not in admin:
17136
17204
  csvPF.WriteRowTitles(flattenJSON(admin))
17137
17205
  else:
gam/gamlib/glclargs.py CHANGED
@@ -1138,6 +1138,7 @@ class GamCLArgs():
1138
1138
  OB_ARGUMENT = 'argument'
1139
1139
  OB_ASP_ID_LIST = 'ASPIDList'
1140
1140
  OB_ASSET_ID = 'AssetID'
1141
+ OB_ADMIN_ASSIGNEE_TYPE_LIST = 'AdminAssigneeTypeList'
1141
1142
  OB_BROWSER_ENROLLEMNT_TOKEN_ID = 'BrowserEnrollmentTokenID'
1142
1143
  OB_BROWSER_ENTITY = 'BrowserEntity'
1143
1144
  OB_BUILDING_ID = 'BuildingID'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.23.4
3
+ Version: 7.23.6
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=oaItKwe2zhuAvz_2tmyBdOqI2-14mxIw3k-enrfqfsY,3620631
1
+ gam/__init__.py,sha256=hT_6mB1-IGqw6dWjKeo0W3EQF73Ve2_NjiX_xB7INIc,3623383
2
2
  gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
3
3
  gam/cacerts.pem,sha256=DUsVo2XlFYwfkhe3gnxa-Km4Z4noz74hSApXwTT-nQE,44344
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -24,7 +24,7 @@ gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
24
24
  gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
25
25
  gam/gamlib/glapi.py,sha256=u97M7Y2BeP3tYEEGYEz-9kY4fdV0fYkeqC3YN-sRwNc,36028
26
26
  gam/gamlib/glcfg.py,sha256=jX9IIrqSa8CPZ-UdnMDs2RuGo8vPh3jpgvRhI9VRbII,28325
27
- gam/gamlib/glclargs.py,sha256=rGcAoRLaCv5L9cBxI56MrPXr0JcImO45bLQNaYahoUY,53251
27
+ gam/gamlib/glclargs.py,sha256=LlTtwJJHqU48l7SQT4bcZCWlw3Y46g42Bn1ACGW8gIk,53307
28
28
  gam/gamlib/glentity.py,sha256=KWFomkoNE6lLE83zVqVIlJ2rkzfLkhEasW1M0TWGieA,35373
29
29
  gam/gamlib/glgapi.py,sha256=pdBbwNtnCwFWxJGaP-_3hdTjSNoOCJF2yo76WdQOi1k,40426
30
30
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
@@ -47,8 +47,8 @@ gam/gdata/apps/audit/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrK
47
47
  gam/gdata/apps/audit/service.py,sha256=Z1eueThcNeVUMWP1DRWc_DGHrJCiJI8W_xj6L-cqu-Q,9658
48
48
  gam/gdata/apps/contacts/__init__.py,sha256=Um6zgIkiahZns7yAEuC3pxHSMD8iciZ_EoynSLoYPfU,30463
49
49
  gam/gdata/apps/contacts/service.py,sha256=5lNb-Ii1Gyek6ePFji3kyoYtCBc8CuJTwagx2BL2o14,15684
50
- gam7-7.23.4.dist-info/METADATA,sha256=wFTkVmPc7GaFtbv--X570TPEmzhxGdoGtHojWs-OSJg,3092
51
- gam7-7.23.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- gam7-7.23.4.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
- gam7-7.23.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- gam7-7.23.4.dist-info/RECORD,,
50
+ gam7-7.23.6.dist-info/METADATA,sha256=BEAOLvBw21I1PEiIFYzkqJhHRdWQeu1_BzMSM6LDzrU,3092
51
+ gam7-7.23.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ gam7-7.23.6.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
+ gam7-7.23.6.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ gam7-7.23.6.dist-info/RECORD,,
File without changes