gam7 7.5.4__py3-none-any.whl → 7.5.5__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.05.04'
28
+ __version__ = '7.05.05'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -5751,14 +5751,18 @@ def convertUIDtoEmailAddressWithType(emailAddressOrUID, cd=None, sal=None, email
5751
5751
  return (uid, 'serviceaccount')
5752
5752
  return (normalizedEmailAddressOrUID, 'unknown')
5753
5753
 
5754
+ NON_EMAIL_MEMBER_PREFIXES = (
5755
+ "cbcm-browser.",
5756
+ "chrome-os-device.",
5757
+ )
5754
5758
  # Convert UID to email address
5755
5759
  def convertUIDtoEmailAddress(emailAddressOrUID, cd=None, emailTypes=None,
5756
5760
  checkForCustomerId=False, ciGroupsAPI=False, aliasAllowed=True):
5757
5761
  if ciGroupsAPI:
5758
- if emailAddressOrUID.startswith('cbcm-browser.') or emailAddressOrUID.startswith('chrome-os-device.'):
5762
+ if emailAddressOrUID.startswith(NON_EMAIL_MEMBER_PREFIXES):
5759
5763
  return emailAddressOrUID
5760
5764
  normalizedEmailAddressOrUID = normalizeEmailAddressOrUID(emailAddressOrUID, ciGroupsAPI=ciGroupsAPI)
5761
- if normalizedEmailAddressOrUID.startswith('cbcm-browser.') or normalizedEmailAddressOrUID.startswith('chrome-os-device.'):
5765
+ if normalizedEmailAddressOrUID.startswith(NON_EMAIL_MEMBER_PREFIXES):
5762
5766
  return normalizedEmailAddressOrUID
5763
5767
  email, _ = convertUIDtoEmailAddressWithType(emailAddressOrUID, cd, emailTypes,
5764
5768
  checkForCustomerId, ciGroupsAPI, aliasAllowed)
@@ -18918,6 +18922,7 @@ CONTACT_USER_DEFINED_FIELDS = 'User Defined Fields'
18918
18922
  CONTACT_WEBSITES = 'Websites'
18919
18923
  #
18920
18924
  class ContactsManager():
18925
+
18921
18926
  CONTACT_ARGUMENT_TO_PROPERTY_MAP = {
18922
18927
  'json': CONTACT_JSON,
18923
18928
  'name': CONTACT_NAME,
@@ -21298,7 +21303,7 @@ def queryPeopleContacts(people, contactQuery, fields, sortOrder, entityType, use
21298
21303
  showMessage = pageMessage.replace(TOTAL_ITEMS_MARKER, str(totalItems))
21299
21304
  writeGotMessage(showMessage.replace('{0}', str(Ent.Choose(Ent.PEOPLE_CONTACT, totalItems))))
21300
21305
  return entityList
21301
- except GAPI.permissionDenied as e:
21306
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
21302
21307
  ClientAPIAccessDeniedExit(str(e))
21303
21308
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21304
21309
  entityUnknownWarning(entityType, user, i, count)
@@ -21448,7 +21453,7 @@ def createUserPeopleContact(users):
21448
21453
  csvPF.WriteRow(row)
21449
21454
  except GAPI.invalidArgument as e:
21450
21455
  entityActionFailedWarning([entityType, user, peopleEntityType, None], str(e), i, count)
21451
- except GAPI.permissionDenied as e:
21456
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
21452
21457
  ClientAPIAccessDeniedExit(str(e))
21453
21458
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21454
21459
  ClientAPIAccessDeniedExit()
@@ -21613,7 +21618,7 @@ def _clearUpdatePeopleContacts(users, updateContacts):
21613
21618
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
21614
21619
  except (GAPI.notFound, GAPI.internalError):
21615
21620
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21616
- except GAPI.permissionDenied as e:
21621
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
21617
21622
  ClientAPIAccessDeniedExit(str(e))
21618
21623
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21619
21624
  ClientAPIAccessDeniedExit()
@@ -21763,7 +21768,7 @@ def dedupReplaceDomainUserPeopleContacts(users):
21763
21768
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
21764
21769
  except (GAPI.notFound, GAPI.internalError):
21765
21770
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21766
- except GAPI.permissionDenied as e:
21771
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
21767
21772
  ClientAPIAccessDeniedExit(str(e))
21768
21773
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21769
21774
  ClientAPIAccessDeniedExit()
@@ -21818,7 +21823,7 @@ def deleteUserPeopleContacts(users):
21818
21823
  entityActionPerformed([entityType, user, peopleEntityType, resourceName], j, jcount)
21819
21824
  except (GAPI.notFound, GAPI.internalError):
21820
21825
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
21821
- except GAPI.permissionDenied as e:
21826
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
21822
21827
  ClientAPIAccessDeniedExit(str(e))
21823
21828
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
21824
21829
  ClientAPIAccessDeniedExit()
@@ -22115,7 +22120,7 @@ def _infoPeople(users, entityType, source):
22115
22120
  except GAPI.invalidArgument as e:
22116
22121
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
22117
22122
  continue
22118
- except GAPI.permissionDenied as e:
22123
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
22119
22124
  ClientAPIAccessDeniedExit(str(e))
22120
22125
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22121
22126
  ClientAPIAccessDeniedExit()
@@ -22530,7 +22535,7 @@ def _printShowPeople(source):
22530
22535
  pageSize=GC.Values[GC.PEOPLE_MAX_RESULTS],
22531
22536
  sources=sources, mergeSources=mergeSources,
22532
22537
  readMask=fields, fields='nextPageToken,people', **kwargs)
22533
- except GAPI.permissionDenied as e:
22538
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
22534
22539
  ClientAPIAccessDeniedExit(str(e))
22535
22540
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22536
22541
  ClientAPIAccessDeniedExit()
@@ -22569,14 +22574,14 @@ def doInfoDomainPeopleContacts():
22569
22574
  # [countsonly]
22570
22575
  # [allfields|(fields <PeopleFieldNameList>)] [showmetadata]
22571
22576
  # [formatjson]
22572
- # gam print peoplecontacts [todrive <ToDriveAttribute>*]
22577
+ # gam print domaincontacts|peoplecontacts [todrive <ToDriveAttribute>*]
22573
22578
  # [sources <PeopleSourceName>]
22574
22579
  # [query <String>]
22575
22580
  # [mergesources <PeopleMergeSourceName>]
22576
22581
  # [countsonly]
22577
22582
  # [allfields|(fields <PeopleFieldNameList>)] [showmetadata]
22578
22583
  # [formatjson [quotechar <Character>]]
22579
- # gam show peoplecontacts
22584
+ # gam show domaincontacts|peoplecontacts
22580
22585
  # [sources <PeopleSourceName>]
22581
22586
  # [query <String>]
22582
22587
  # [mergesources <PeopleMergeSourceName>]
@@ -22652,7 +22657,7 @@ def printShowUserPeopleProfiles(users):
22652
22657
  except GAPI.notFound:
22653
22658
  entityUnknownWarning(Ent.PEOPLE_PROFILE, user, i, count)
22654
22659
  continue
22655
- except GAPI.permissionDenied as e:
22660
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
22656
22661
  ClientAPIAccessDeniedExit(str(e))
22657
22662
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22658
22663
  ClientAPIAccessDeniedExit()
@@ -22808,7 +22813,7 @@ def _processPeopleContactPhotos(users, function):
22808
22813
  entityDoesNotHaveItemWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], j, jcount)
22809
22814
  except (GAPI.invalidArgument, OSError, IOError) as e:
22810
22815
  entityActionFailedWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], str(e), j, jcount)
22811
- except GAPI.permissionDenied as e:
22816
+ except (GAPI.permissionDenied, GAPI.failedPrecondition) as e:
22812
22817
  ClientAPIAccessDeniedExit(str(e))
22813
22818
  except (GAPI.serviceNotAvailable, GAPI.forbidden):
22814
22819
  ClientAPIAccessDeniedExit()
@@ -34182,7 +34187,7 @@ def doPrintGroupMembers():
34182
34187
  for name in info['names']:
34183
34188
  if name['metadata']['source']['type'] == sourceType:
34184
34189
  return name['displayName']
34185
- except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden, GAPI.permissionDenied):
34190
+ except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden, GAPI.permissionDenied, GAPI.failedPrecondition):
34186
34191
  pass
34187
34192
  return unknownName
34188
34193
 
@@ -35729,10 +35734,16 @@ def _showPolicies(policies, FJQC, add_warnings, no_appnames,
35729
35734
  _showPolicy(policy, FJQC, i, count)
35730
35735
  Ind.Decrement()
35731
35736
 
35737
+ def _checkPoliciesWithDASA():
35738
+ if GC.Values[GC.ENABLE_DASA]:
35739
+ systemErrorExit(USAGE_ERROR_RC,
35740
+ Msg.COMMAND_NOT_COMPATIBLE_WITH_ENABLE_DASA.format(Act.ToPerform().lower(), Cmd.ARG_CIPOLICIES))
35741
+
35732
35742
  # gam info policies <CIPolicyNameEntity>
35733
35743
  # [nowarnings] [noappnames]
35734
35744
  # [formatjson]
35735
35745
  def doInfoCIPolicies():
35746
+ _checkPoliciesWithDASA()
35736
35747
  groups_ci = buildGAPIObject(API.CLOUDIDENTITY_GROUPS)
35737
35748
  ci = buildGAPIObject(API.CLOUDIDENTITY_POLICY)
35738
35749
  cd = buildGAPIObject(API.DIRECTORY)
@@ -35791,6 +35802,7 @@ def doPrintShowCIPolicies():
35791
35802
  ensure_ascii=False,
35792
35803
  sort_keys=True)})
35793
35804
 
35805
+ _checkPoliciesWithDASA()
35794
35806
  groups_ci = buildGAPIObject(API.CLOUDIDENTITY_GROUPS)
35795
35807
  ci = buildGAPIObject(API.CLOUDIDENTITY_POLICY)
35796
35808
  cd = buildGAPIObject(API.DIRECTORY)
@@ -40379,20 +40391,20 @@ def convertExportNameToID(v, nameOrId, matterId, matterNameId):
40379
40391
  if cg:
40380
40392
  try:
40381
40393
  export = callGAPI(v.matters().exports(), 'get',
40382
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
40394
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40383
40395
  matterId=matterId, exportId=cg.group(1))
40384
40396
  return (export['id'], export['name'], formatVaultNameId(export['id'], export['name']))
40385
40397
  except (GAPI.notFound, GAPI.badRequest):
40386
40398
  entityDoesNotHaveItemExit([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, nameOrId])
40387
- except GAPI.forbidden:
40388
- ClientAPIAccessDeniedExit()
40399
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40400
+ ClientAPIAccessDeniedExit(str(e))
40389
40401
  nameOrIdlower = nameOrId.lower()
40390
40402
  try:
40391
40403
  exports = callGAPIpages(v.matters().exports(), 'list', 'exports',
40392
- throwReasons=[GAPI.FORBIDDEN],
40404
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40393
40405
  matterId=matterId, fields='exports(id,name),nextPageToken')
40394
- except GAPI.forbidden:
40395
- ClientAPIAccessDeniedExit()
40406
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40407
+ ClientAPIAccessDeniedExit(str(e))
40396
40408
  for export in exports:
40397
40409
  if export['name'].lower() == nameOrIdlower:
40398
40410
  return (export['id'], export['name'], formatVaultNameId(export['id'], export['name']))
@@ -40403,20 +40415,20 @@ def convertHoldNameToID(v, nameOrId, matterId, matterNameId):
40403
40415
  if cg:
40404
40416
  try:
40405
40417
  hold = callGAPI(v.matters().holds(), 'get',
40406
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
40418
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40407
40419
  matterId=matterId, holdId=cg.group(1))
40408
40420
  return (hold['holdId'], hold['name'], formatVaultNameId(hold['holdId'], hold['name']))
40409
40421
  except (GAPI.notFound, GAPI.badRequest):
40410
40422
  entityDoesNotHaveItemExit([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, nameOrId])
40411
- except GAPI.forbidden:
40412
- ClientAPIAccessDeniedExit()
40423
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40424
+ ClientAPIAccessDeniedExit(str(e))
40413
40425
  nameOrIdlower = nameOrId.lower()
40414
40426
  try:
40415
40427
  holds = callGAPIpages(v.matters().holds(), 'list', 'holds',
40416
- throwReasons=[GAPI.FORBIDDEN],
40428
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40417
40429
  matterId=matterId, fields='holds(holdId,name),nextPageToken')
40418
- except GAPI.forbidden:
40419
- ClientAPIAccessDeniedExit()
40430
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40431
+ ClientAPIAccessDeniedExit(str(e))
40420
40432
  for hold in holds:
40421
40433
  if hold['name'].lower() == nameOrIdlower:
40422
40434
  return (hold['holdId'], hold['name'], formatVaultNameId(hold['holdId'], hold['name']))
@@ -40427,17 +40439,17 @@ def convertMatterNameToID(v, nameOrId, state=None):
40427
40439
  if cg:
40428
40440
  try:
40429
40441
  matter = callGAPI(v.matters(), 'get',
40430
- throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN],
40442
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40431
40443
  matterId=cg.group(1), view='BASIC', fields='matterId,name,state')
40432
40444
  return (matter['matterId'], matter['name'], formatVaultNameId(matter['name'], matter['matterId']), matter['state'])
40433
40445
  except (GAPI.notFound, GAPI.forbidden):
40434
40446
  entityDoesNotExistExit(Ent.VAULT_MATTER, nameOrId)
40435
40447
  try:
40436
40448
  matters = callGAPIpages(v.matters(), 'list', 'matters',
40437
- throwReasons=[GAPI.FORBIDDEN],
40449
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40438
40450
  view='BASIC', state=state, fields='matters(matterId,name,state),nextPageToken')
40439
- except GAPI.forbidden:
40440
- ClientAPIAccessDeniedExit()
40451
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40452
+ ClientAPIAccessDeniedExit(str(e))
40441
40453
  nameOrIdlower = nameOrId.lower()
40442
40454
  ids = []
40443
40455
  states = []
@@ -40458,20 +40470,20 @@ def convertQueryNameToID(v, nameOrId, matterId, matterNameId):
40458
40470
  if cg:
40459
40471
  try:
40460
40472
  query = callGAPI(v.matters().savedQueries(), 'get',
40461
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
40473
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40462
40474
  matterId=matterId, savedQueryId=cg.group(1))
40463
40475
  return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']))
40464
40476
  except (GAPI.notFound, GAPI.badRequest):
40465
40477
  entityDoesNotHaveItemExit([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, nameOrId])
40466
- except GAPI.forbidden:
40467
- ClientAPIAccessDeniedExit()
40478
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40479
+ ClientAPIAccessDeniedExit(str(e))
40468
40480
  nameOrIdlower = nameOrId.lower()
40469
40481
  try:
40470
40482
  queries = callGAPIpages(v.matters().savedQueries(), 'list', 'savedQueries',
40471
- throwReasons=[GAPI.FORBIDDEN],
40483
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40472
40484
  matterId=matterId, fields='savedQueries(savedQueryId,displayName),nextPageToken')
40473
- except GAPI.forbidden:
40474
- ClientAPIAccessDeniedExit()
40485
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40486
+ ClientAPIAccessDeniedExit(str(e))
40475
40487
  for query in queries:
40476
40488
  if query['displayName'].lower() == nameOrIdlower:
40477
40489
  return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']))
@@ -40485,9 +40497,9 @@ def warnMatterNotOpen(v, matter, matterNameId, j, jcount):
40485
40497
  if v is not None:
40486
40498
  try:
40487
40499
  matter['state'] = callGAPI(v.matters(), 'get',
40488
- throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN],
40500
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40489
40501
  matterId=matter['matterId'], view='BASIC', fields='state')['state']
40490
- except (GAPI.notFound, GAPI.forbidden):
40502
+ except (GAPI.notFound, GAPI.forbidden, GAPI.invalidArgument):
40491
40503
  matter['state'] = 'Unknown'
40492
40504
  else:
40493
40505
  setSysExitRC(DATA_NOT_AVALIABLE_RC)
@@ -40803,10 +40815,10 @@ def doDeleteVaultExport():
40803
40815
  unknownArgumentExit()
40804
40816
  try:
40805
40817
  callGAPI(v.matters().exports(), 'delete',
40806
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
40818
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40807
40819
  matterId=matterId, exportId=exportId)
40808
40820
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, exportNameId])
40809
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
40821
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
40810
40822
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, exportNameId], str(e))
40811
40823
 
40812
40824
  VAULT_EXPORT_FIELDS_CHOICE_MAP = {
@@ -40857,10 +40869,10 @@ def doInfoVaultExport():
40857
40869
  fields = getFieldsFromFieldsList(fieldsList)
40858
40870
  try:
40859
40871
  export = callGAPI(v.matters().exports(), 'get',
40860
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
40872
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40861
40873
  matterId=matterId, exportId=exportId, fields=fields)
40862
40874
  _showVaultExport(matterNameId, export, cd, FJQC)
40863
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
40875
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
40864
40876
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, exportNameId], str(e))
40865
40877
 
40866
40878
  VAULT_EXPORT_STATUS_MAP = {'completed': 'COMPLETED', 'failed': 'FAILED', 'inprogress': 'IN_PROGRESS'}
@@ -40923,9 +40935,9 @@ def doPrintShowVaultExports():
40923
40935
  try:
40924
40936
  results = callGAPIpages(v.matters(), 'list', 'matters',
40925
40937
  pageMessage=getPageMessage(),
40926
- throwReasons=[GAPI.FORBIDDEN],
40938
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40927
40939
  view='BASIC', state='OPEN', fields='matters(matterId,name,state),nextPageToken')
40928
- except GAPI.forbidden as e:
40940
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40929
40941
  entityActionFailedWarning([Ent.VAULT_EXPORT, None], str(e))
40930
40942
  return
40931
40943
  else:
@@ -40953,12 +40965,12 @@ def doPrintShowVaultExports():
40953
40965
  try:
40954
40966
  exports = callGAPIpages(v.matters().exports(), 'list', 'exports',
40955
40967
  pageMessage=pageMessage,
40956
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
40968
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
40957
40969
  matterId=matterId, fields=fields)
40958
40970
  except GAPI.failedPrecondition:
40959
40971
  warnMatterNotOpen(v, matter, matterNameId, j, jcount)
40960
40972
  continue
40961
- except GAPI.forbidden as e:
40973
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
40962
40974
  entityActionFailedWarning([Ent.VAULT_EXPORT, None], str(e))
40963
40975
  break
40964
40976
  else:
@@ -41053,9 +41065,9 @@ def doCopyVaultExport():
41053
41065
  while True:
41054
41066
  try:
41055
41067
  export = callGAPI(v.matters().exports(), 'get',
41056
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41068
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41057
41069
  matterId=matterId, exportId=exportId)
41058
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41070
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41059
41071
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, exportNameId], str(e))
41060
41072
  return
41061
41073
  if export['status'] == 'COMPLETED':
@@ -41153,9 +41165,9 @@ def doDownloadVaultExport():
41153
41165
  while True:
41154
41166
  try:
41155
41167
  export = callGAPI(v.matters().exports(), 'get',
41156
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41168
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41157
41169
  matterId=matterId, exportId=exportId)
41158
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41170
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41159
41171
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_EXPORT, exportNameId], str(e))
41160
41172
  return
41161
41173
  if export['status'] == 'COMPLETED':
@@ -41343,7 +41355,8 @@ def doCreateVaultHold():
41343
41355
  body['accounts'].append({'accountId': convertEmailAddressToUID(account, cd, accountType, accountsLocation)})
41344
41356
  try:
41345
41357
  hold = callGAPI(v.matters().holds(), 'create',
41346
- throwReasons=[GAPI.ALREADY_EXISTS, GAPI.BAD_REQUEST, GAPI.BACKEND_ERROR, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
41358
+ throwReasons=[GAPI.ALREADY_EXISTS, GAPI.BAD_REQUEST, GAPI.BACKEND_ERROR, GAPI.FAILED_PRECONDITION,
41359
+ GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41347
41360
  matterId=matterId, body=body)
41348
41361
  if not returnIdOnly:
41349
41362
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, formatVaultNameId(hold['name'], hold['holdId'])])
@@ -41351,7 +41364,8 @@ def doCreateVaultHold():
41351
41364
  _showVaultHold(None, hold, None, None)
41352
41365
  else:
41353
41366
  writeStdout(f'{hold["holdId"]}\n')
41354
- except (GAPI.alreadyExists, GAPI.badRequest, GAPI.backendError, GAPI.failedPrecondition, GAPI.forbidden) as e:
41367
+ except (GAPI.alreadyExists, GAPI.badRequest, GAPI.backendError, GAPI.failedPrecondition,
41368
+ GAPI.forbidden, GAPI.invalidArgument) as e:
41355
41369
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, body.get('name')], str(e))
41356
41370
 
41357
41371
  # gam update vaulthold|hold <HoldItem> matter <MatterItem>
@@ -41396,9 +41410,9 @@ def doUpdateVaultHold():
41396
41410
  missingArgumentExit('matter')
41397
41411
  try:
41398
41412
  old_body = callGAPI(v.matters().holds(), 'get',
41399
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41413
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41400
41414
  matterId=matterId, holdId=holdId, fields='name,corpus,query,orgUnit')
41401
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41415
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41402
41416
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId], str(e))
41403
41417
  return
41404
41418
  accountType = 'group' if old_body['corpus'] == 'GROUPS' else 'user'
@@ -41424,10 +41438,10 @@ def doUpdateVaultHold():
41424
41438
  if body:
41425
41439
  try:
41426
41440
  hold = callGAPI(v.matters().holds(), 'update',
41427
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41441
+ throwReas=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41428
41442
  matterId=matterId, holdId=holdId, body=body)
41429
41443
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId])
41430
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41444
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41431
41445
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId], str(e))
41432
41446
  return
41433
41447
  jcount = len(addAccountIds)
@@ -41440,12 +41454,12 @@ def doUpdateVaultHold():
41440
41454
  j += 1
41441
41455
  try:
41442
41456
  callGAPI(v.matters().holds().accounts(), 'create',
41443
- throwReasons=[GAPI.ALREADY_EXISTS, GAPI.BACKEND_ERROR, GAPI.FORBIDDEN],
41457
+ throwReasons=[GAPI.ALREADY_EXISTS, GAPI.BACKEND_ERROR, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41444
41458
  matterId=matterId, holdId=holdId, body={'accountId': account['id']})
41445
41459
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId, Ent.ACCOUNT, account['email']], j, jcount)
41446
41460
  except (GAPI.alreadyExists, GAPI.backendError) as e:
41447
41461
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId, Ent.ACCOUNT, account['email']], str(e), j, jcount)
41448
- except GAPI.forbidden as e:
41462
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41449
41463
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, None], str(e))
41450
41464
  return
41451
41465
  Ind.Decrement()
@@ -41461,12 +41475,12 @@ def doUpdateVaultHold():
41461
41475
  j += 1
41462
41476
  try:
41463
41477
  callGAPI(v.matters().holds().accounts(), 'delete',
41464
- throwReasons=[GAPI.NOT_FOUND, GAPI.BACKEND_ERROR, GAPI.FORBIDDEN],
41478
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BACKEND_ERROR, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41465
41479
  matterId=matterId, holdId=holdId, accountId=account['id'])
41466
41480
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId, Ent.ACCOUNT, account['email']], j, jcount)
41467
41481
  except (GAPI.alreadyExists, GAPI.backendError) as e:
41468
41482
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId, Ent.ACCOUNT, account['email']], str(e), j, jcount)
41469
- except GAPI.forbidden as e:
41483
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41470
41484
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, None], str(e))
41471
41485
  return
41472
41486
  Ind.Decrement()
@@ -41491,10 +41505,10 @@ def doDeleteVaultHold():
41491
41505
  unknownArgumentExit()
41492
41506
  try:
41493
41507
  callGAPI(v.matters().holds(), 'delete',
41494
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41508
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41495
41509
  matterId=matterId, holdId=holdId)
41496
41510
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId])
41497
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41511
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41498
41512
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId], str(e))
41499
41513
 
41500
41514
  VAULT_HOLD_FIELDS_CHOICE_MAP = {
@@ -41544,10 +41558,10 @@ def doInfoVaultHold():
41544
41558
  fields = getFieldsFromFieldsList(fieldsList)
41545
41559
  try:
41546
41560
  hold = callGAPI(v.matters().holds(), 'get',
41547
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41561
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41548
41562
  matterId=matterId, holdId=holdId, fields=fields)
41549
41563
  _showVaultHold(matterNameId, hold, cd, FJQC)
41550
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41564
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41551
41565
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_HOLD, holdNameId], str(e))
41552
41566
 
41553
41567
  PRINT_VAULT_HOLDS_TITLES = ['matterId', 'matterName', 'holdId', 'name', 'updateTime']
@@ -41598,9 +41612,9 @@ def doPrintShowVaultHolds():
41598
41612
  try:
41599
41613
  results = callGAPIpages(v.matters(), 'list', 'matters',
41600
41614
  pageMessage=getPageMessage(),
41601
- throwReasons=[GAPI.FORBIDDEN],
41615
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41602
41616
  view='BASIC', state='OPEN', fields='matters(matterId,name,state),nextPageToken')
41603
- except GAPI.forbidden as e:
41617
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41604
41618
  entityActionFailedWarning([Ent.VAULT_HOLD, None], str(e))
41605
41619
  return
41606
41620
  else:
@@ -41627,12 +41641,12 @@ def doPrintShowVaultHolds():
41627
41641
  try:
41628
41642
  holds = callGAPIpages(v.matters().holds(), 'list', 'holds',
41629
41643
  pageMessage=pageMessage,
41630
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
41644
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41631
41645
  matterId=matterId, fields=fields)
41632
41646
  except GAPI.failedPrecondition:
41633
41647
  warnMatterNotOpen(v, matter, matterNameId, j, jcount)
41634
41648
  continue
41635
- except GAPI.forbidden as e:
41649
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41636
41650
  entityActionFailedWarning([Ent.VAULT_HOLD, None], str(e))
41637
41651
  break
41638
41652
  else:
@@ -41678,9 +41692,9 @@ def printShowUserVaultHolds(entityList):
41678
41692
  try:
41679
41693
  matters = callGAPIpages(v.matters(), 'list', 'matters',
41680
41694
  pageMessage=getPageMessage(),
41681
- throwReasons=[GAPI.FORBIDDEN],
41695
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41682
41696
  view='BASIC', state='OPEN', fields='matters(matterId,name,state),nextPageToken')
41683
- except GAPI.forbidden as e:
41697
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41684
41698
  entityActionFailedWarning([Ent.VAULT_HOLD, None], str(e))
41685
41699
  return
41686
41700
  jcount = len(matters)
@@ -41694,11 +41708,11 @@ def printShowUserVaultHolds(entityList):
41694
41708
  try:
41695
41709
  matter['holds'] = callGAPIpages(v.matters().holds(), 'list', 'holds',
41696
41710
  pageMessage=getPageMessageForWhom(),
41697
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
41711
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41698
41712
  matterId=matterId, fields='holds(holdId,name,accounts(accountId,email),orgUnit(orgUnitId)),nextPageToken')
41699
41713
  except GAPI.failedPrecondition:
41700
41714
  warnMatterNotOpen(v, matter, matterNameId, j, jcount)
41701
- except GAPI.forbidden as e:
41715
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41702
41716
  entityActionFailedWarning([Ent.VAULT_HOLD, None], str(e), j, jcount)
41703
41717
  totalHolds = 0
41704
41718
  _, _, entityList = getEntityArgument(entityList)
@@ -41809,10 +41823,10 @@ def doInfoVaultQuery():
41809
41823
  fields = getFieldsFromFieldsList(fieldsList)
41810
41824
  try:
41811
41825
  query = callGAPI(v.matters().savedQueries(), 'get',
41812
- throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
41826
+ throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41813
41827
  matterId=matterId, savedQueryId=queryId, fields=fields)
41814
41828
  _showVaultQuery(matterNameId, query, cd, FJQC)
41815
- except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden) as e:
41829
+ except (GAPI.notFound, GAPI.badRequest, GAPI.forbidden, GAPI.invalidArgument) as e:
41816
41830
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, queryNameId], str(e))
41817
41831
 
41818
41832
  PRINT_VAULT_QUERIES_TITLES = ['matterId', 'matterName', 'savedQueryId', 'displayName']
@@ -41853,9 +41867,9 @@ def doPrintShowVaultQueries():
41853
41867
  try:
41854
41868
  results = callGAPIpages(v.matters(), 'list', 'matters',
41855
41869
  pageMessage=getPageMessage(),
41856
- throwReasons=[GAPI.FORBIDDEN],
41870
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41857
41871
  view='BASIC', state='OPEN', fields='matters(matterId,name,state),nextPageToken')
41858
- except GAPI.forbidden as e:
41872
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41859
41873
  entityActionFailedWarning([Ent.VAULT_QUERY, None], str(e))
41860
41874
  return
41861
41875
  else:
@@ -41882,12 +41896,12 @@ def doPrintShowVaultQueries():
41882
41896
  try:
41883
41897
  queries = callGAPIpages(v.matters().savedQueries(), 'list', 'savedQueries',
41884
41898
  pageMessage=pageMessage,
41885
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
41899
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41886
41900
  matterId=matterId, fields=fields)
41887
41901
  except GAPI.failedPrecondition:
41888
41902
  warnMatterNotOpen(v, matter, matterNameId, j, jcount)
41889
41903
  continue
41890
- except GAPI.forbidden as e:
41904
+ except (GAPI.forbidden, GAPI.invalidArgument) as e:
41891
41905
  entityActionFailedWarning([Ent.VAULT_QUERY, None], str(e))
41892
41906
  break
41893
41907
  else:
@@ -41974,7 +41988,7 @@ def doCreateVaultMatter():
41974
41988
  body['name'] = f'GAM Matter - {ISOformatTimeStamp(todaysTime())}'
41975
41989
  try:
41976
41990
  matter = callGAPI(v.matters(), 'create',
41977
- throwReasons=[GAPI.ALREADY_EXISTS, GAPI.FORBIDDEN],
41991
+ throwReasons=[GAPI.ALREADY_EXISTS, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41978
41992
  body=body)
41979
41993
  matterId = matter['matterId']
41980
41994
  matterNameId = formatVaultNameId(matter['name'], matterId)
@@ -41982,7 +41996,7 @@ def doCreateVaultMatter():
41982
41996
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId])
41983
41997
  else:
41984
41998
  writeStdout(f'{matterId}\n')
41985
- except (GAPI.alreadyExists, GAPI.forbidden) as e:
41999
+ except (GAPI.alreadyExists, GAPI.forbidden, GAPI.invalidArgument) as e:
41986
42000
  entityActionFailedWarning([Ent.VAULT_MATTER, body['name']], str(e))
41987
42001
  return
41988
42002
  jcount = len(collaborators)
@@ -41997,11 +42011,11 @@ def doCreateVaultMatter():
41997
42011
  cbody['matterPermission']['accountId'] = collaborator['id']
41998
42012
  try:
41999
42013
  callGAPI(v.matters(), 'addPermissions',
42000
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
42014
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42001
42015
  matterId=matterId, body=cbody)
42002
42016
  if not returnIdOnly:
42003
42017
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.COLLABORATOR, collaborator['email']], j, jcount)
42004
- except (GAPI.failedPrecondition, GAPI.forbidden) as e:
42018
+ except (GAPI.failedPrecondition, GAPI.forbidden, GAPI.invalidArgument) as e:
42005
42019
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42006
42020
  break
42007
42021
  Ind.Decrement()
@@ -42025,10 +42039,10 @@ def doActionVaultMatter(action, matterId=None, matterNameId=None, v=None):
42025
42039
  action_kwargs = {} if action == 'delete' else {'body': {}}
42026
42040
  try:
42027
42041
  callGAPI(v.matters(), action,
42028
- throwReasons=[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
42042
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42029
42043
  matterId=matterId, **action_kwargs)
42030
42044
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId])
42031
- except (GAPI.notFound, GAPI.failedPrecondition, GAPI.forbidden) as e:
42045
+ except (GAPI.notFound, GAPI.failedPrecondition, GAPI.forbidden, GAPI.invalidArgument) as e:
42032
42046
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42033
42047
 
42034
42048
  # gam close vaultmatter|matter <MatterItem>
@@ -42081,7 +42095,7 @@ def doUpdateVaultMatter():
42081
42095
  if 'name' not in body or 'description' not in body:
42082
42096
  # bah, API requires name/description to be sent on update even when it's not changing
42083
42097
  result = callGAPI(v.matters(), 'get',
42084
- throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN],
42098
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42085
42099
  matterId=matterId, view='BASIC')
42086
42100
  body.setdefault('name', result['name'])
42087
42101
  body.setdefault('description', result.get('description'))
@@ -42089,7 +42103,7 @@ def doUpdateVaultMatter():
42089
42103
  throwReasons=[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
42090
42104
  matterId=matterId, body=body)
42091
42105
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId])
42092
- except (GAPI.notFound, GAPI.failedPrecondition, GAPI.forbidden) as e:
42106
+ except (GAPI.notFound, GAPI.failedPrecondition, GAPI.forbidden, GAPI.invalidArgument) as e:
42093
42107
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42094
42108
  return
42095
42109
  jcount = len(addCollaborators)
@@ -42102,10 +42116,10 @@ def doUpdateVaultMatter():
42102
42116
  j += 1
42103
42117
  try:
42104
42118
  callGAPI(v.matters(), 'addPermissions',
42105
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
42119
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42106
42120
  matterId=matterId, body={'matterPermission': {'role': 'COLLABORATOR', 'accountId': collaborator['id']}})
42107
42121
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.COLLABORATOR, collaborator['email']], j, jcount)
42108
- except (GAPI.failedPrecondition, GAPI.forbidden) as e:
42122
+ except (GAPI.failedPrecondition, GAPI.forbidden, GAPI.invalidArgument) as e:
42109
42123
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42110
42124
  break
42111
42125
  Ind.Decrement()
@@ -42119,10 +42133,10 @@ def doUpdateVaultMatter():
42119
42133
  j += 1
42120
42134
  try:
42121
42135
  callGAPI(v.matters(), 'removePermissions',
42122
- throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN],
42136
+ throwReasons=[GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42123
42137
  matterId=matterId, body={'accountId': collaborator['id']})
42124
42138
  entityActionPerformed([Ent.VAULT_MATTER, matterNameId, Ent.COLLABORATOR, collaborator['email']], j, jcount)
42125
- except (GAPI.failedPrecondition, GAPI.forbidden) as e:
42139
+ except (GAPI.failedPrecondition, GAPI.forbidden, GAPI.invalidArgument) as e:
42126
42140
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42127
42141
  break
42128
42142
  Ind.Decrement()
@@ -42155,11 +42169,11 @@ def doInfoVaultMatter():
42155
42169
  fields = getFieldsFromFieldsList(fieldsList)
42156
42170
  try:
42157
42171
  matter = callGAPI(v.matters(), 'get',
42158
- throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN],
42172
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
42159
42173
  matterId=matterId, view=view, fields=fields)
42160
42174
  cd = buildGAPIObject(API.DIRECTORY) if 'matterPermissions' in matter else None
42161
42175
  _showVaultMatter(matter, cd, FJQC)
42162
- except (GAPI.notFound, GAPI.forbidden) as e:
42176
+ except (GAPI.notFound, GAPI.forbidden, GAPI.invalidArgument) as e:
42163
42177
  entityActionFailedWarning([Ent.VAULT_MATTER, matterNameId], str(e))
42164
42178
 
42165
42179
  VAULT_MATTER_STATE_MAP = {'open': 'OPEN', 'closed': 'CLOSED', 'deleted': 'DELETED'}
@@ -42215,9 +42229,9 @@ def doPrintShowVaultMatters():
42215
42229
  try:
42216
42230
  matters = callGAPIpages(v.matters(), 'list', 'matters',
42217
42231
  pageMessage=getPageMessage(),
42218
- throwReasons=[GAPI.FORBIDDEN],
42232
+ throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT, GAPI.INVALID_ARGUMENT],
42219
42233
  view=view, state=stateParm, fields=fields)
42220
- except GAPI.forbidden as e:
42234
+ except (GAPI.forbidden, GAPI.invalidArgument, GAPI.invalidArgument) as e:
42221
42235
  entityActionFailedWarning([Ent.VAULT_MATTER, None], str(e))
42222
42236
  return
42223
42237
  jcount = len(matters)
@@ -42408,6 +42422,8 @@ class PasswordOptions():
42408
42422
  self.makeCleanPassword = True
42409
42423
  self.cleanPasswordLen = 25
42410
42424
  self.randomPasswordChars = None
42425
+ self.promptForPassword = False
42426
+ self.promptForUniquePassword = False
42411
42427
  self.notifyPasswordSet = False
42412
42428
  self.updateCmd = updateCmd
42413
42429
  self.filename = ''
@@ -42454,7 +42470,7 @@ class PasswordOptions():
42454
42470
  self.makeCleanPassword = True
42455
42471
  notFoundBody[up] = self.CreateRandomPassword()
42456
42472
  self.notFoundPassword = notFoundBody[up]
42457
- elif myarg == 'lograndompassword':
42473
+ elif myarg in {'lograndompassword', 'logpassword'}:
42458
42474
  self.filename = getString(Cmd.OB_FILE_NAME)
42459
42475
  else:
42460
42476
  return False
@@ -42475,7 +42491,8 @@ class PasswordOptions():
42475
42491
  password = self.GetPassword()
42476
42492
  if password:
42477
42493
  body[up] = password
42478
- self.makeRandomPassword = self.makeUniqueRandomPassword = False
42494
+ self.makeRandomPassword = self.makeUniqueRandomPassword =\
42495
+ self.promptForPassword = self.promptForUniquePassword = False
42479
42496
  if password.lower() == 'blocklogin':
42480
42497
  self.makeRandomPassword = True
42481
42498
  self.makeCleanPassword = False
@@ -42488,6 +42505,13 @@ class PasswordOptions():
42488
42505
  self.makeUniqueRandomPassword = self.makeCleanPassword = True
42489
42506
  else:
42490
42507
  self.makeRandomPassword = self.makeCleanPassword = True
42508
+ elif password.lower() == 'prompt':
42509
+ self.promptForPassword = True
42510
+ elif password.lower() == 'uniqueprompt':
42511
+ if self.updateCmd:
42512
+ self.promptForUniquePassword = True
42513
+ else:
42514
+ self.promptForPassword = True
42491
42515
  elif up == 'hashFunction':
42492
42516
  body[up] = self.HASH_FUNCTION_MAP[myarg]
42493
42517
  self.clearPassword = self.hashPassword = False
@@ -42510,11 +42534,17 @@ class PasswordOptions():
42510
42534
  except Exception:
42511
42535
  pass
42512
42536
 
42513
- def AssignPassword(self, body, notify, notFoundBody, createIfNotFound):
42537
+ def AssignPassword(self, body, notify, notFoundBody, createIfNotFound, user=None):
42514
42538
  up = 'password'
42515
42539
  if self.makeRandomPassword or self.makeUniqueRandomPassword:
42516
42540
  body[up] = self.CreateRandomPassword()
42517
42541
  self.password = body[up]
42542
+ elif user and (self.promptForPassword or self.promptForUniquePassword):
42543
+ body[up] = readStdin(f'Enter password for {user}: ')
42544
+ self.password = body[up]
42545
+ elif self.promptForPassword:
42546
+ body[up] = readStdin('Enter password: ')
42547
+ self.password = body[up]
42518
42548
  if up in body:
42519
42549
  self.FinalizePassword(body, notify, up)
42520
42550
  elif 'hashFunction' in body:
@@ -43148,7 +43178,12 @@ def getUserAttributes(cd, updateCmd, noUid=False):
43148
43178
  body[up][schemaName][fieldName] = None
43149
43179
  else:
43150
43180
  unknownArgumentExit()
43151
- if not PwdOpts.makeUniqueRandomPassword:
43181
+ if PwdOpts.promptForPassword or PwdOpts.promptForUniquePassword:
43182
+ if not updateCmd:
43183
+ PwdOpts.AssignPassword(body, notify, notFoundBody, parameters['createIfNotFound'], body['primaryEmail'])
43184
+ elif not PwdOpts.promptForUniquePassword:
43185
+ PwdOpts.AssignPassword(body, notify, notFoundBody, parameters['createIfNotFound'])
43186
+ elif not PwdOpts.makeUniqueRandomPassword:
43152
43187
  PwdOpts.AssignPassword(body, notify, notFoundBody, parameters['createIfNotFound'])
43153
43188
  return (body, notify, tagReplacements, addGroups, addAliases, PwdOpts,
43154
43189
  updatePrimaryEmail, notFoundBody, groupOrgUnitMap, parameters,
@@ -43182,7 +43217,7 @@ def createUserAddAliases(cd, user, aliasList, i, count):
43182
43217
  # [replyto <EmailAaddress>]
43183
43218
  # [<NotifyMessageContent>]
43184
43219
  # (replace <Tag> <UserReplacement>)*]
43185
- # [lograndompassword <FileName>] [ignorenullpassword]
43220
+ # [logpassword <FileName>] [ignorenullpassword]
43186
43221
  # [verifynotinvitable]
43187
43222
  # [addnumericsuffixonduplicate <Number>]
43188
43223
  def doCreateUser():
@@ -43287,7 +43322,7 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
43287
43322
  # [<NotifyMessageContent>]
43288
43323
  # (replace <Tag> <UserReplacement>)*]
43289
43324
  # [notifyonupdate [<Boolean>]]
43290
- # [lograndompassword <FileName>] [ignorenullpassword]
43325
+ # [logpassword <FileName>] [ignorenullpassword]
43291
43326
  def updateUsers(entityList):
43292
43327
  def waitingForCreationToComplete(sleep_time):
43293
43328
  writeStderr(Ind.Spaces()+Msg.WAITING_FOR_ITEM_CREATION_TO_COMPLETE_SLEEPING.format(Ent.Singular(Ent.USER), sleep_time))
@@ -43369,8 +43404,8 @@ def updateUsers(entityList):
43369
43404
  if isInvitableUser:
43370
43405
  entityActionNotPerformedWarning([Ent.USER, body['primaryEmail']], Msg.EMAIL_ADDRESS_IS_UNMANAGED_ACCOUNT, i, count)
43371
43406
  continue
43372
- if PwdOpts.makeUniqueRandomPassword:
43373
- PwdOpts.AssignPassword(body, notify, notFoundBody, parameters['createIfNotFound'])
43407
+ if PwdOpts.makeUniqueRandomPassword or PwdOpts.promptForUniquePassword:
43408
+ PwdOpts.AssignPassword(body, notify, notFoundBody, parameters['createIfNotFound'], userKey)
43374
43409
  retry = 0
43375
43410
  while True:
43376
43411
  try:
gam/gamlib/glgapi.py CHANGED
@@ -273,7 +273,7 @@ LOOKERSTUDIO_THROW_REASONS = [INVALID_ARGUMENT, SERVICE_NOT_AVAILABLE, BAD_REQUE
273
273
  MEMBERS_THROW_REASONS = [GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, INVALID, FORBIDDEN, SERVICE_NOT_AVAILABLE]
274
274
  MEMBERS_RETRY_REASONS = [SYSTEM_ERROR, SERVICE_NOT_AVAILABLE]
275
275
  ORGUNIT_GET_THROW_REASONS = [INVALID_ORGUNIT, ORGUNIT_NOT_FOUND, BACKEND_ERROR, BAD_REQUEST, INVALID_CUSTOMER_ID, LOGIN_REQUIRED]
276
- PEOPLE_ACCESS_THROW_REASONS = [SERVICE_NOT_AVAILABLE, FORBIDDEN, PERMISSION_DENIED]
276
+ PEOPLE_ACCESS_THROW_REASONS = [SERVICE_NOT_AVAILABLE, FORBIDDEN, PERMISSION_DENIED, FAILED_PRECONDITION]
277
277
  RESELLER_THROW_REASONS = [BAD_REQUEST, RESOURCE_NOT_FOUND, FORBIDDEN, INVALID]
278
278
  SHEETS_ACCESS_THROW_REASONS = DRIVE_USER_THROW_REASONS+[NOT_FOUND, PERMISSION_DENIED, FORBIDDEN, INTERNAL_ERROR, INSUFFICIENT_FILE_PERMISSIONS,
279
279
  BAD_REQUEST, INVALID, INVALID_ARGUMENT, FAILED_PRECONDITION]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.5.4
3
+ Version: 7.5.5
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=rwZ8aAbkZxi3Nd-0Lu0tR74FXgdo8AmbU91PWwNYrCk,3477201
1
+ gam/__init__.py,sha256=0VP1nWMVS7s80KV7vRP-w5PeBVxPPai8MF-k3IWFVf4,3480758
2
2
  gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
3
3
  gam/cacerts.pem,sha256=nJuWha0xm5dHw_5ptGphwRoO-r36Ccpqiww9pCEDbSc,67484
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -27,7 +27,7 @@ gam/gamlib/glapi.py,sha256=EAQXkaM13t6jjh9vL4eHJqIZRI5kmzeneiFs5xcWXfg,34304
27
27
  gam/gamlib/glcfg.py,sha256=cV011FpIWge4oi5_dJrdof66vUqX6UCvTGWWTNVmYEg,28055
28
28
  gam/gamlib/glclargs.py,sha256=ptSTGELZHQS6SfvGGJ3NrXRoHAToO108NTYsFQE-C4c,42200
29
29
  gam/gamlib/glentity.py,sha256=ZLbyMl9NhN-MBf9Rxmho2dBYeS4SNLMctpeaKFZSbQ4,33801
30
- gam/gamlib/glgapi.py,sha256=W1nFH0sY7P8pnb98_4uzMSCs8gre0rvG5pBRI6HJq0c,38274
30
+ gam/gamlib/glgapi.py,sha256=TYPc91Ab-tNr-_nRArhPdRaB_6FbCZjBBNpEmRJuXrw,38295
31
31
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
32
32
  gam/gamlib/glglobals.py,sha256=B0kCz4K6PO1-n3eZI_lvdRG99Ane1-dH4zS4J4aymlI,9566
33
33
  gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
@@ -65,8 +65,8 @@ gam/googleapiclient/discovery_cache/base.py,sha256=yCDPtxnbNN-p5_9fzBacC6P3wcUPl
65
65
  gam/googleapiclient/discovery_cache/file_cache.py,sha256=sim3Mg4HgRYo3vX75jvcKy_aV568EvIrtBfvfbw-044,4774
66
66
  gam/iso8601/__init__.py,sha256=Z2PsYbXgAH5a5xzUvgczCboPzqWpm65kRcIngCnhViU,1218
67
67
  gam/iso8601/iso8601.py,sha256=Li2FHZ4sBTWuthuQhyCvmvj0j6At8JbGzkSv2fc2RHU,4384
68
- gam7-7.5.4.dist-info/METADATA,sha256=R-XdAa_ne_ejIefOdApUOSS27cDo5MrZfEd-5rymb1Q,2888
69
- gam7-7.5.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
- gam7-7.5.4.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
71
- gam7-7.5.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
- gam7-7.5.4.dist-info/RECORD,,
68
+ gam7-7.5.5.dist-info/METADATA,sha256=rxgTKAvDjeNdo6glMn1MVmjTCjLxBwe1rAPN-0VHmzY,2888
69
+ gam7-7.5.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
+ gam7-7.5.5.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
71
+ gam7-7.5.5.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
72
+ gam7-7.5.5.dist-info/RECORD,,
File without changes