gam7 7.19.3__py3-none-any.whl → 7.28.2__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.
gam/__main__.py CHANGED
@@ -34,7 +34,12 @@ def main():
34
34
 
35
35
  # Run from command line
36
36
  if __name__ == '__main__':
37
- if platform.system() != 'Linux':
37
+ if getattr(sys, 'frozen', False): # we're frozen:
38
38
  multiprocessing.freeze_support()
39
+ if platform.system() == 'Linux':
40
+ # set explictly since it's not default in Python < 3.14, forkserver should
41
+ # be safer than fork and less likely to see bulk command hangs.
42
+ multiprocessing.set_start_method('forkserver')
43
+ else:
39
44
  multiprocessing.set_start_method('spawn')
40
45
  main()
gam/gamlib/glapi.py CHANGED
@@ -46,7 +46,6 @@ CLASSROOM = 'classroom'
46
46
  CLOUDCHANNEL = 'cloudchannel'
47
47
  CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
48
48
  CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
49
- CLOUDIDENTITY_GROUPS_BETA = 'cloudidentitygroupsbeta'
50
49
  CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
51
50
  CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
52
51
  CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
@@ -105,6 +104,8 @@ YOUTUBE = 'youtube'
105
104
  BUSINESSACCOUNTMANAGEMENT_SCOPE = 'https://www.googleapis.com/auth/business.manage'
106
105
  CHROMEVERSIONHISTORY_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms'
107
106
  DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive'
107
+ DRIVE_FILE_SCOPE = 'https://www.googleapis.com/auth/drive.file'
108
+ DRIVE_READONLY_SCOPE = 'https://www.googleapis.com/auth/drive.readonly'
108
109
  GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'
109
110
  GOOGLE_AUTH_PROVIDER_X509_CERT_URL = 'https://www.googleapis.com/oauth2/v1/certs'
110
111
  GOOGLE_OAUTH2_ENDPOINT = 'https://accounts.google.com/o/oauth2/v2/auth'
@@ -156,6 +157,7 @@ OAUTH2_TOKEN_ERRORS = [
156
157
  'access_denied: Account restricted',
157
158
  'internal_failure: Backend Error',
158
159
  'internal_failure: None',
160
+ 'invalid_account: Forbidden',
159
161
  'invalid_grant',
160
162
  'invalid_grant: Bad Request',
161
163
  'invalid_grant: Invalid email or User ID',
@@ -239,7 +241,6 @@ _INFO = {
239
241
  CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
240
242
  CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
241
243
  CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
242
- CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
243
244
  CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
244
245
  CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
245
246
  CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
@@ -253,7 +254,7 @@ _INFO = {
253
254
  DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
254
255
  DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
255
256
  DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
256
- DRIVETD: {'name': 'Drive API v3 - todrive', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
257
+ DRIVETD: {'name': 'Drive API v3 - write todrive data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
257
258
  DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
258
259
  DRIVELABELS_ADMIN: {'name': 'Drive Labels API - Admin', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
259
260
  DRIVELABELS_USER: {'name': 'Drive Labels API - User', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
@@ -283,7 +284,7 @@ _INFO = {
283
284
  SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
284
285
  SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
285
286
  SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
286
- SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
287
+ SHEETSTD: {'name': 'Sheets API - write todrive data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
287
288
  SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
288
289
  STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
289
290
  STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
@@ -384,10 +385,6 @@ _CLIENT_SCOPES = [
384
385
  'api': CLOUDIDENTITY_GROUPS,
385
386
  'subscopes': READONLY,
386
387
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
387
- {'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
388
- 'api': CLOUDIDENTITY_GROUPS_BETA,
389
- 'subscopes': [],
390
- 'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
391
388
  {'name': 'Cloud Identity API - Inbound SSO Settings',
392
389
  'api': CLOUDIDENTITY_INBOUND_SSO,
393
390
  'subscopes': READONLY,
@@ -400,8 +397,7 @@ _CLIENT_SCOPES = [
400
397
  'api': CLOUDIDENTITY_POLICY,
401
398
  'subscopes': READONLY,
402
399
  'roByDefault': True,
403
- 'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'
404
- },
400
+ 'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'},
405
401
  {'name': 'Cloud Identity API - User Invitations',
406
402
  'api': CLOUDIDENTITY_USERINVITATIONS,
407
403
  'subscopes': READONLY,
@@ -416,7 +412,7 @@ _CLIENT_SCOPES = [
416
412
  'subscopes': [],
417
413
  'offByDefault': True,
418
414
  'scope': STORAGE_READWRITE_SCOPE},
419
- {'name': 'Contacts API - Domain Shared Contacts and GAL',
415
+ {'name': 'Contacts API - Domain Shared Contacts',
420
416
  'api': CONTACTS,
421
417
  'subscopes': [],
422
418
  'scope': 'https://www.google.com/m8/feeds'},
@@ -530,6 +526,17 @@ _CLIENT_SCOPES = [
530
526
  'scope': 'https://www.googleapis.com/auth/ediscovery'},
531
527
  ]
532
528
 
529
+ _COMMANDDATA_CLIENT_SCOPES = [
530
+ {'name': 'Drive API - commanddata_clientaccess',
531
+ 'api': DRIVE3,
532
+ 'subscopes': [],
533
+ 'scope': DRIVE_READONLY_SCOPE},
534
+ {'name': 'Sheets API - commanddata_clientaccess',
535
+ 'api': SHEETS,
536
+ 'subscopes': [],
537
+ 'scope': 'https://www.googleapis.com/auth/spreadsheets.readonly'},
538
+ ]
539
+
533
540
  _TODRIVE_CLIENT_SCOPES = [
534
541
  {'name': 'Drive API - todrive_clientaccess',
535
542
  'api': DRIVE3,
@@ -538,7 +545,7 @@ _TODRIVE_CLIENT_SCOPES = [
538
545
  {'name': 'Drive File API - todrive_clientaccess',
539
546
  'api': DRIVE3,
540
547
  'subscopes': [],
541
- 'scope': 'https://www.googleapis.com/auth/drive.file'},
548
+ 'scope': DRIVE_FILE_SCOPE},
542
549
  {'name': 'Gmail API - todrive_clientaccess',
543
550
  'api': GMAIL,
544
551
  'subscopes': [],
@@ -643,7 +650,8 @@ _SVCACCT_SCOPES = [
643
650
  {'name': 'Drive Activity API v2 - must pair with Drive API',
644
651
  'api': DRIVEACTIVITY,
645
652
  'subscopes': [],
646
- 'scope': 'https://www.googleapis.com/auth/drive.activity'},
653
+ 'scope': [DRIVE_READONLY_SCOPE,
654
+ 'https://www.googleapis.com/auth/drive.activity']},
647
655
  {'name': 'Drive Labels API - Admin',
648
656
  'api': DRIVELABELS_ADMIN,
649
657
  'subscopes': READONLY,
@@ -656,10 +664,12 @@ _SVCACCT_SCOPES = [
656
664
  'api': DOCS,
657
665
  'subscopes': READONLY,
658
666
  'scope': 'https://www.googleapis.com/auth/documents'},
659
- {'name': 'Forms API',
667
+ {'name': 'Forms API - must pair with Drive API',
660
668
  'api': FORMS,
661
669
  'subscopes': [],
662
- 'scope': DRIVE_SCOPE},
670
+ 'scope': [DRIVE_READONLY_SCOPE,
671
+ 'https://www.googleapis.com/auth/forms.body',
672
+ 'https://www.googleapis.com/auth/forms.responses.readonly']},
663
673
  {'name': 'Gmail API - Full Access (Labels, Messages)',
664
674
  'api': GMAIL,
665
675
  'subscopes': [],
@@ -750,9 +760,10 @@ _SVCACCT_SCOPES = [
750
760
  ]
751
761
 
752
762
  _SVCACCT_SPECIAL_SCOPES = [
753
- {'name': 'Drive API - todrive',
763
+ {'name': 'Drive API - write todrive data - has access to all Drive',
754
764
  'api': DRIVETD,
755
765
  'subscopes': [],
766
+ 'offByDefault': True,
756
767
  'scope': DRIVE_SCOPE},
757
768
  {'name': 'Gmail API - Full Access - read only',
758
769
  'api': GMAIL,
@@ -764,8 +775,9 @@ _SVCACCT_SPECIAL_SCOPES = [
764
775
  'subscopes': [],
765
776
  'offByDefault': True,
766
777
  'scope': GMAIL_SEND_SCOPE},
767
- {'name': 'Sheets API - todrive',
778
+ {'name': 'Sheets API - write todrive data - has access to all Sheets',
768
779
  'api': SHEETSTD,
780
+ 'offByDefault': True,
769
781
  'subscopes': [],
770
782
  'scope': 'https://www.googleapis.com/auth/spreadsheets'},
771
783
  ]
@@ -789,14 +801,18 @@ def getVersion(api):
789
801
  def getClientScopesSet(api):
790
802
  return {scope['scope'] for scope in _CLIENT_SCOPES if scope['api'] == api}
791
803
 
792
- def getClientScopesList(todriveClientAccess):
804
+ def getClientScopesList(commanddataClientAccess, todriveClientAccess):
793
805
  caScopes = _CLIENT_SCOPES[:]
806
+ if commanddataClientAccess:
807
+ caScopes.extend(_COMMANDDATA_CLIENT_SCOPES)
794
808
  if todriveClientAccess:
795
809
  caScopes.extend(_TODRIVE_CLIENT_SCOPES)
796
810
  return sorted(caScopes, key=lambda k: k['name'])
797
811
 
798
- def getClientScopesURLs(todriveClientAccess):
812
+ def getClientScopesURLs(commanddataClientAccess, todriveClientAccess):
799
813
  caScopes = _CLIENT_SCOPES[:]
814
+ if commanddataClientAccess:
815
+ caScopes.extend(_COMMANDDATA_CLIENT_SCOPES)
800
816
  if todriveClientAccess:
801
817
  caScopes.extend(_TODRIVE_CLIENT_SCOPES)
802
818
  return sorted({scope['scope'] for scope in _CLIENT_SCOPES})
gam/gamlib/glcfg.py CHANGED
@@ -69,6 +69,8 @@ CACHE_DISCOVERY_ONLY = 'cache_discovery_only'
69
69
  CHANNEL_CUSTOMER_ID = 'channel_customer_id'
70
70
  # Character set of batch, csv, data files
71
71
  CHARSET = 'charset'
72
+ # When retrieving lists of Chat items from API, how many should be retrieved in each chunk
73
+ CHAT_MAX_RESULTS = 'chat_max_results'
72
74
  # When retrieving lists of Google Classroom items from API, how many should be retrieved in each chunk
73
75
  CLASSROOM_MAX_RESULTS = 'classroom_max_results'
74
76
  # Path to client_secrets.json
@@ -83,6 +85,8 @@ CMDLOG_MAX__BACKUPS = 'cmdlog_max__backups'
83
85
  CMDLOG_MAX_BACKUPS = 'cmdlog_max_backups'
84
86
  # Command logging max kilo bytes per log file
85
87
  CMDLOG_MAX_KILO_BYTES = 'cmdlog_max_kilo_bytes'
88
+ # Use client access for command data from Google Docs/Sheets
89
+ COMMANDDATA_CLIENTACCESS = 'commanddata_clientaccess'
86
90
  # GAM config directory containing client_secrets.json, oauth2.txt, oauth2service.json, extra_args.txt
87
91
  CONFIG_DIR = 'config_dir'
88
92
  # When retrieving lists of Google Contacts from API, how many should be retrieved in each chunk
@@ -145,6 +149,10 @@ CSV_OUTPUT_USERS_AUDIT = 'csv_output_users_audit'
145
149
  CUSTOMER_ID = 'customer_id'
146
150
  # If debug_level > 0: extra_args['prettyPrint'] = True, httplib2.debuglevel = gam_debug_level, appsObj.debug = True
147
151
  DEBUG_LEVEL = 'debug_level'
152
+ # redact sensitive credentials from debug output
153
+ DEBUG_REDACTION = 'debug_redaction'
154
+ # Developer Preview API Key
155
+ DEVELOPER_PREVIEW_API_KEY = 'developer_preview_api_key'
148
156
  # When retrieving lists of ChromeOS devices from API, how many should be retrieved in each chunk
149
157
  DEVICE_MAX_RESULTS = 'device_max_results'
150
158
  # Domain obtained from gam.cfg or oauth2.txt
@@ -333,12 +341,14 @@ Defaults = {
333
341
  CACHE_DISCOVERY_ONLY: TRUE,
334
342
  CHARSET: DEFAULT_CHARSET,
335
343
  CHANNEL_CUSTOMER_ID: '',
344
+ CHAT_MAX_RESULTS: '100',
336
345
  CLASSROOM_MAX_RESULTS: '0',
337
346
  CLIENT_SECRETS_JSON: FN_CLIENT_SECRETS_JSON,
338
347
  CLOCK_SKEW_IN_SECONDS: '10',
339
348
  CMDLOG: '',
340
349
  CMDLOG_MAX_BACKUPS: 5,
341
350
  CMDLOG_MAX_KILO_BYTES: 1000,
351
+ COMMANDDATA_CLIENTACCESS: FALSE,
342
352
  CONFIG_DIR: '',
343
353
  CONTACT_MAX_RESULTS: '100',
344
354
  CSV_INPUT_COLUMN_DELIMITER: ',',
@@ -370,6 +380,8 @@ Defaults = {
370
380
  CSV_OUTPUT_USERS_AUDIT: FALSE,
371
381
  CUSTOMER_ID: MY_CUSTOMER,
372
382
  DEBUG_LEVEL: '0',
383
+ DEBUG_REDACTION: TRUE,
384
+ DEVELOPER_PREVIEW_API_KEY: '',
373
385
  DEVICE_MAX_RESULTS: '200',
374
386
  DOMAIN: '',
375
387
  DRIVE_DIR: '',
@@ -499,12 +511,14 @@ VAR_INFO = {
499
511
  CACHE_DISCOVERY_ONLY: {VAR_TYPE: TYPE_BOOLEAN, VAR_SIGFILE: 'allcache.txt', VAR_SFFT: (TRUE, FALSE)},
500
512
  CHARSET: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'GAM_CHARSET', VAR_LIMITS: (1, None)},
501
513
  CHANNEL_CUSTOMER_ID: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
514
+ CHAT_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
502
515
  CLASSROOM_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (0, 1000)},
503
516
  CLIENT_SECRETS_JSON: {VAR_TYPE: TYPE_FILE, VAR_ENVVAR: 'CLIENTSECRETS', VAR_ACCESS: os.R_OK},
504
517
  CLOCK_SKEW_IN_SECONDS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (10, 3600)},
505
518
  CMDLOG: {VAR_TYPE: TYPE_FILE, VAR_ACCESS: os.W_OK},
506
519
  CMDLOG_MAX_BACKUPS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10)},
507
520
  CMDLOG_MAX_KILO_BYTES: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (100, 10000)},
521
+ COMMANDDATA_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
508
522
  CONFIG_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMUSERCONFIGDIR'},
509
523
  CONTACT_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10000)},
510
524
  CSV_INPUT_COLUMN_DELIMITER: {VAR_TYPE: TYPE_CHARACTER},
@@ -536,6 +550,8 @@ VAR_INFO = {
536
550
  CSV_OUTPUT_USERS_AUDIT: {VAR_TYPE: TYPE_BOOLEAN},
537
551
  CUSTOMER_ID: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'CUSTOMER_ID', VAR_LIMITS: (0, None)},
538
552
  DEBUG_LEVEL: {VAR_TYPE: TYPE_INTEGER, VAR_SIGFILE: 'debug.gam', VAR_LIMITS: (0, None), VAR_SFFT: ('0', '4')},
553
+ DEBUG_REDACTION: {VAR_TYPE: TYPE_BOOLEAN},
554
+ DEVELOPER_PREVIEW_API_KEY: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
539
555
  DEVICE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
540
556
  DOMAIN: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'GA_DOMAIN', VAR_LIMITS: (0, None)},
541
557
  DRIVE_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMDRIVEDIR'},