gam7 7.23.6__tar.gz → 7.24.0__tar.gz

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.

Files changed (303) hide show
  1. {gam7-7.23.6 → gam7-7.24.0}/PKG-INFO +1 -1
  2. {gam7-7.23.6 → gam7-7.24.0}/src/GamCommands.txt +3 -0
  3. {gam7-7.23.6 → gam7-7.24.0}/src/GamUpdate.txt +18 -0
  4. {gam7-7.23.6 → gam7-7.24.0}/src/gam/__init__.py +51 -45
  5. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glapi.py +20 -4
  6. {gam7-7.23.6 → gam7-7.24.0}/wiki/Administrators.md +8 -1
  7. {gam7-7.23.6 → gam7-7.24.0}/wiki/Basic-Items.md +1 -0
  8. {gam7-7.23.6 → gam7-7.24.0}/wiki/GamUpdates.md +14 -0
  9. {gam7-7.23.6 → gam7-7.24.0}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  10. {gam7-7.23.6 → gam7-7.24.0}/wiki/List-Items.md +1 -0
  11. {gam7-7.23.6 → gam7-7.24.0}/wiki/Vault-Takeout.md +3 -3
  12. {gam7-7.23.6 → gam7-7.24.0}/wiki/Version-and-Help.md +3 -3
  13. {gam7-7.23.6 → gam7-7.24.0}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  14. {gam7-7.23.6 → gam7-7.24.0}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  15. {gam7-7.23.6 → gam7-7.24.0}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  16. {gam7-7.23.6 → gam7-7.24.0}/.github/ISSUE_TEMPLATE.txt +0 -0
  17. {gam7-7.23.6 → gam7-7.24.0}/.github/actions/decrypt.sh +0 -0
  18. {gam7-7.23.6 → gam7-7.24.0}/.github/actions/entitlements.plist +0 -0
  19. {gam7-7.23.6 → gam7-7.24.0}/.github/actions/package_exclusions.txt +0 -0
  20. {gam7-7.23.6 → gam7-7.24.0}/.github/stale.yml +0 -0
  21. {gam7-7.23.6 → gam7-7.24.0}/.github/workflows/build.yml +0 -0
  22. {gam7-7.23.6 → gam7-7.24.0}/.github/workflows/codeql-analysis.yml +0 -0
  23. {gam7-7.23.6 → gam7-7.24.0}/.github/workflows/get-cacerts.yml +0 -0
  24. {gam7-7.23.6 → gam7-7.24.0}/.github/workflows/pushwiki.yml +0 -0
  25. {gam7-7.23.6 → gam7-7.24.0}/.github/workflows/pypi.yml +0 -0
  26. {gam7-7.23.6 → gam7-7.24.0}/LICENSE +0 -0
  27. {gam7-7.23.6 → gam7-7.24.0}/README.md +0 -0
  28. {gam7-7.23.6 → gam7-7.24.0}/pyproject.toml +0 -0
  29. {gam7-7.23.6 → gam7-7.24.0}/src/.gitignore +0 -0
  30. {gam7-7.23.6 → gam7-7.24.0}/src/LICENSE +0 -0
  31. {gam7-7.23.6 → gam7-7.24.0}/src/README.md +0 -0
  32. {gam7-7.23.6 → gam7-7.24.0}/src/callgam.py +0 -0
  33. {gam7-7.23.6 → gam7-7.24.0}/src/gam/__main__.py +0 -0
  34. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/client.py +0 -0
  37. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/core.py +0 -0
  38. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/data.py +0 -0
  39. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/http.py +0 -0
  40. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/service.py +0 -0
  46. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.23.6 → gam7-7.24.0}/src/gam/atom/url.py +0 -0
  48. {gam7-7.23.6 → gam7-7.24.0}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.23.6 → gam7-7.24.0}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.23.6 → gam7-7.24.0}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.23.6 → gam7-7.24.0}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glcfg.py +0 -0
  55. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glclargs.py +0 -0
  56. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glentity.py +0 -0
  57. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glgapi.py +0 -0
  58. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glgdata.py +0 -0
  59. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glglobals.py +0 -0
  60. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glindent.py +0 -0
  61. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glmsgs.py +0 -0
  62. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glskus.py +0 -0
  63. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/gluprop.py +0 -0
  64. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/glverlibs.py +0 -0
  65. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gamlib/yubikey.py +0 -0
  66. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/__init__.py +0 -0
  67. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/alt/__init__.py +0 -0
  68. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/alt/app_engine.py +0 -0
  69. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/alt/appengine.py +0 -0
  70. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/__init__.py +0 -0
  71. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/audit/__init__.py +0 -0
  72. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/audit/service.py +0 -0
  73. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  74. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/contacts/service.py +0 -0
  75. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/apps/service.py +0 -0
  76. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/service.py +0 -0
  77. {gam7-7.23.6 → gam7-7.24.0}/src/gam/gdata/urlfetch.py +0 -0
  78. {gam7-7.23.6 → gam7-7.24.0}/src/gam/meet-v2beta.json +0 -0
  79. {gam7-7.23.6 → gam7-7.24.0}/src/gam/serviceaccountlookup-v1.json +0 -0
  80. {gam7-7.23.6 → gam7-7.24.0}/src/gam-install.sh +0 -0
  81. {gam7-7.23.6 → gam7-7.24.0}/src/gam-setup.bat +0 -0
  82. {gam7-7.23.6 → gam7-7.24.0}/src/gam.exe.manifest +0 -0
  83. {gam7-7.23.6 → gam7-7.24.0}/src/gam.py +0 -0
  84. {gam7-7.23.6 → gam7-7.24.0}/src/gam.spec +0 -0
  85. {gam7-7.23.6 → gam7-7.24.0}/src/gam.wxs +0 -0
  86. {gam7-7.23.6 → gam7-7.24.0}/src/license.rtf +0 -0
  87. {gam7-7.23.6 → gam7-7.24.0}/src/tools/a_atleast_b.py +0 -0
  88. {gam7-7.23.6 → gam7-7.24.0}/src/tools/gen-wix-xml-filelist.py +0 -0
  89. {gam7-7.23.6 → gam7-7.24.0}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  90. {gam7-7.23.6 → gam7-7.24.0}/src/tools/hooks/hook-httplib2.py +0 -0
  91. {gam7-7.23.6 → gam7-7.24.0}/src/tools/mkGamRef.py +0 -0
  92. {gam7-7.23.6 → gam7-7.24.0}/src/tools/openssl.props +0 -0
  93. {gam7-7.23.6 → gam7-7.24.0}/src/tools/ssd.mjs +0 -0
  94. {gam7-7.23.6 → gam7-7.24.0}/src/version_info.txt.in +0 -0
  95. {gam7-7.23.6 → gam7-7.24.0}/wiki/00scratch.md +0 -0
  96. {gam7-7.23.6 → gam7-7.24.0}/wiki/Addresses.md +0 -0
  97. {gam7-7.23.6 → gam7-7.24.0}/wiki/Alert-Center.md +0 -0
  98. {gam7-7.23.6 → gam7-7.24.0}/wiki/Aliases.md +0 -0
  99. {gam7-7.23.6 → gam7-7.24.0}/wiki/Authorization.md +0 -0
  100. {gam7-7.23.6 → gam7-7.24.0}/wiki/BNF-Syntax.md +0 -0
  101. {gam7-7.23.6 → gam7-7.24.0}/wiki/Bulk-Processing.md +0 -0
  102. {gam7-7.23.6 → gam7-7.24.0}/wiki/Business-Account-Management.md +0 -0
  103. {gam7-7.23.6 → gam7-7.24.0}/wiki/CSV-Input-Filtering.md +0 -0
  104. {gam7-7.23.6 → gam7-7.24.0}/wiki/CSV-Output-Filtering.md +0 -0
  105. {gam7-7.23.6 → gam7-7.24.0}/wiki/CSV-Special-Characters.md +0 -0
  106. {gam7-7.23.6 → gam7-7.24.0}/wiki/Calendars-Access.md +0 -0
  107. {gam7-7.23.6 → gam7-7.24.0}/wiki/Calendars-Events.md +0 -0
  108. {gam7-7.23.6 → gam7-7.24.0}/wiki/Calendars.md +0 -0
  109. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chat-Bot-Setup-Use.md +0 -0
  110. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-AUE-Counts.md +0 -0
  111. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  112. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Installed-Apps.md +0 -0
  113. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  114. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Policies.md +0 -0
  115. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Printers.md +0 -0
  116. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Profile-Management.md +0 -0
  117. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Version-Counts.md +0 -0
  118. {gam7-7.23.6 → gam7-7.24.0}/wiki/Chrome-Version-History.md +0 -0
  119. {gam7-7.23.6 → gam7-7.24.0}/wiki/ChromeOS-Devices.md +0 -0
  120. {gam7-7.23.6 → gam7-7.24.0}/wiki/Classroom-Courses.md +0 -0
  121. {gam7-7.23.6 → gam7-7.24.0}/wiki/Classroom-Guardians.md +0 -0
  122. {gam7-7.23.6 → gam7-7.24.0}/wiki/Classroom-Invitations.md +0 -0
  123. {gam7-7.23.6 → gam7-7.24.0}/wiki/Classroom-Membership.md +0 -0
  124. {gam7-7.23.6 → gam7-7.24.0}/wiki/Classroom-StudentGroups.md +0 -0
  125. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Channel.md +0 -0
  126. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Identity-Devices.md +0 -0
  127. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  128. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Identity-Groups.md +0 -0
  129. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Identity-Policies.md +0 -0
  130. {gam7-7.23.6 → gam7-7.24.0}/wiki/Cloud-Storage.md +0 -0
  131. {gam7-7.23.6 → gam7-7.24.0}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  132. {gam7-7.23.6 → gam7-7.24.0}/wiki/Collections-of-Items.md +0 -0
  133. {gam7-7.23.6 → gam7-7.24.0}/wiki/Collections-of-Users.md +0 -0
  134. {gam7-7.23.6 → gam7-7.24.0}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  135. {gam7-7.23.6 → gam7-7.24.0}/wiki/Command-Line-Parsing.md +0 -0
  136. {gam7-7.23.6 → gam7-7.24.0}/wiki/Command-Logging-Progress.md +0 -0
  137. {gam7-7.23.6 → gam7-7.24.0}/wiki/Context-Aware-Access-Levels.md +0 -0
  138. {gam7-7.23.6 → gam7-7.24.0}/wiki/Customer.md +0 -0
  139. {gam7-7.23.6 → gam7-7.24.0}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  140. {gam7-7.23.6 → gam7-7.24.0}/wiki/Domain-SharedContacts.md +0 -0
  141. {gam7-7.23.6 → gam7-7.24.0}/wiki/Domains-Verification.md +0 -0
  142. {gam7-7.23.6 → gam7-7.24.0}/wiki/Domains.md +0 -0
  143. {gam7-7.23.6 → gam7-7.24.0}/wiki/Downloads-Installs.md +0 -0
  144. {gam7-7.23.6 → gam7-7.24.0}/wiki/Drive-File-Selection.md +0 -0
  145. {gam7-7.23.6 → gam7-7.24.0}/wiki/Drive-Items.md +0 -0
  146. {gam7-7.23.6 → gam7-7.24.0}/wiki/Drive-REST-API-v3.md +0 -0
  147. {gam7-7.23.6 → gam7-7.24.0}/wiki/Email-Audit-Monitor.md +0 -0
  148. {gam7-7.23.6 → gam7-7.24.0}/wiki/Find-File-Owner.md +0 -0
  149. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM-Public-Chat-Room.md +0 -0
  150. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM-Release-Process.md +0 -0
  151. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM-Return-Codes.md +0 -0
  152. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  153. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM7-FAQ.md +0 -0
  154. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM7-on-Android-Devices.md +0 -0
  155. {gam7-7.23.6 → gam7-7.24.0}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  156. {gam7-7.23.6 → gam7-7.24.0}/wiki/Global-Address-List.md +0 -0
  157. {gam7-7.23.6 → gam7-7.24.0}/wiki/Google-Data-Transfers.md +0 -0
  158. {gam7-7.23.6 → gam7-7.24.0}/wiki/Google-Network-Addresses.md +0 -0
  159. {gam7-7.23.6 → gam7-7.24.0}/wiki/Groups-Membership.md +0 -0
  160. {gam7-7.23.6 → gam7-7.24.0}/wiki/Groups.md +0 -0
  161. {gam7-7.23.6 → gam7-7.24.0}/wiki/HTTPS-Proxy.md +0 -0
  162. {gam7-7.23.6 → gam7-7.24.0}/wiki/Home.md +0 -0
  163. {gam7-7.23.6 → gam7-7.24.0}/wiki/How-to-Install-GAM7.md +0 -0
  164. {gam7-7.23.6 → gam7-7.24.0}/wiki/How-to-Uninstall-GAM7.md +0 -0
  165. {gam7-7.23.6 → gam7-7.24.0}/wiki/How-to-Update-GAM7.md +0 -0
  166. {gam7-7.23.6 → gam7-7.24.0}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  167. {gam7-7.23.6 → gam7-7.24.0}/wiki/Inbound-SSO.md +0 -0
  168. {gam7-7.23.6 → gam7-7.24.0}/wiki/Install-GAM-as-Python-Library.md +0 -0
  169. {gam7-7.23.6 → gam7-7.24.0}/wiki/Licenses.md +0 -0
  170. {gam7-7.23.6 → gam7-7.24.0}/wiki/List.md +0 -0
  171. {gam7-7.23.6 → gam7-7.24.0}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  172. {gam7-7.23.6 → gam7-7.24.0}/wiki/Mobile-Devices.md +0 -0
  173. {gam7-7.23.6 → gam7-7.24.0}/wiki/Organizational-Units.md +0 -0
  174. {gam7-7.23.6 → gam7-7.24.0}/wiki/Other-Resources.md +0 -0
  175. {gam7-7.23.6 → gam7-7.24.0}/wiki/Permission-Matches.md +0 -0
  176. {gam7-7.23.6 → gam7-7.24.0}/wiki/Python-Regular-Expressions.md +0 -0
  177. {gam7-7.23.6 → gam7-7.24.0}/wiki/README.md +0 -0
  178. {gam7-7.23.6 → gam7-7.24.0}/wiki/Rclone.md +0 -0
  179. {gam7-7.23.6 → gam7-7.24.0}/wiki/Reports.md +0 -0
  180. {gam7-7.23.6 → gam7-7.24.0}/wiki/Reseller.md +0 -0
  181. {gam7-7.23.6 → gam7-7.24.0}/wiki/Resources.md +0 -0
  182. {gam7-7.23.6 → gam7-7.24.0}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  183. {gam7-7.23.6 → gam7-7.24.0}/wiki/SSL-Root-CA-Certificates.md +0 -0
  184. {gam7-7.23.6 → gam7-7.24.0}/wiki/Schemas.md +0 -0
  185. {gam7-7.23.6 → gam7-7.24.0}/wiki/Scripts.md +0 -0
  186. {gam7-7.23.6 → gam7-7.24.0}/wiki/Send-Email.md +0 -0
  187. {gam7-7.23.6 → gam7-7.24.0}/wiki/Shared-Drives.md +0 -0
  188. {gam7-7.23.6 → gam7-7.24.0}/wiki/Sites.md +0 -0
  189. {gam7-7.23.6 → gam7-7.24.0}/wiki/Tag-Replace.md +0 -0
  190. {gam7-7.23.6 → gam7-7.24.0}/wiki/Todrive.md +0 -0
  191. {gam7-7.23.6 → gam7-7.24.0}/wiki/Unmanaged-Accounts.md +0 -0
  192. {gam7-7.23.6 → gam7-7.24.0}/wiki/Upgrade-Benefits.md +0 -0
  193. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Analytics-Admin.md +0 -0
  194. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Application-Specific-Passwords.md +0 -0
  195. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Backup-Verification-Codes.md +0 -0
  196. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Calendars-Access.md +0 -0
  197. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Calendars-Events.md +0 -0
  198. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Calendars.md +0 -0
  199. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Chat.md +0 -0
  200. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Classification-Labels.md +0 -0
  201. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Classroom-Profile.md +0 -0
  202. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Contacts-Delegates.md +0 -0
  203. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Contacts.md +0 -0
  204. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Deprovision.md +0 -0
  205. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Activity-Settings.md +0 -0
  206. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Cleanup.md +0 -0
  207. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Comments.md +0 -0
  208. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Copy-Move.md +0 -0
  209. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Files-Display.md +0 -0
  210. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Files-Manage.md +0 -0
  211. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Orphans.md +0 -0
  212. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Ownership.md +0 -0
  213. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Permissions.md +0 -0
  214. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Query.md +0 -0
  215. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Revisions.md +0 -0
  216. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Shortcuts.md +0 -0
  217. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Drive-Transfer.md +0 -0
  218. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Forms.md +0 -0
  219. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-CSE.md +0 -0
  220. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Delegates.md +0 -0
  221. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Filters.md +0 -0
  222. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Forwarding.md +0 -0
  223. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Labels.md +0 -0
  224. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  225. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Profile.md +0 -0
  226. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-S-MIME.md +0 -0
  227. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  228. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Gmail-Settings.md +0 -0
  229. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Group-Membership.md +0 -0
  230. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Keep-Notes.md +0 -0
  231. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Looker-Studio.md +0 -0
  232. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Meet.md +0 -0
  233. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-People-Contacts-Profiles.md +0 -0
  234. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Photo.md +0 -0
  235. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Profile-Photo.md +0 -0
  236. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Profile-Sharing.md +0 -0
  237. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Shared-Drives.md +0 -0
  238. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  239. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Spreadsheets.md +0 -0
  240. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Tag-Manager.md +0 -0
  241. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Tasks.md +0 -0
  242. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Tokens.md +0 -0
  243. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  244. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users-YouTube.md +0 -0
  245. {gam7-7.23.6 → gam7-7.24.0}/wiki/Users.md +0 -0
  246. {gam7-7.23.6 → gam7-7.24.0}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  247. {gam7-7.23.6 → gam7-7.24.0}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  248. {gam7-7.23.6 → gam7-7.24.0}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  249. {gam7-7.23.6 → gam7-7.24.0}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  250. {gam7-7.23.6 → gam7-7.24.0}/wiki/_Sidebar.md +0 -0
  251. {gam7-7.23.6 → gam7-7.24.0}/wiki/gam.cfg.md +0 -0
  252. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Android-Installation.md +0 -0
  254. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-BulkOperations.md +0 -0
  255. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-CalendarExamples.md +0 -0
  256. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Chat-Bot.md +0 -0
  257. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Custom-Schemas.md +0 -0
  273. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Data-Transfers.md +0 -0
  274. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-DomainVerification.md +0 -0
  275. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-ExamplesCSV.md +0 -0
  277. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM-options-files.md +0 -0
  282. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Home.md +0 -0
  290. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-LicenseExamples.md +0 -0
  293. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Managing-Admins.md +0 -0
  294. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Managing-Devices.md +0 -0
  296. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Printers.md +0 -0
  299. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-ResellerCommands.md +0 -0
  300. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-SecurityExamples.md +0 -0
  301. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.23.6 → gam7-7.24.0}/wiki/legacy/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.23.6
3
+ Version: 7.24.0
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
@@ -1553,6 +1553,9 @@ gam create|add admin <EmailAddress>|<UniqueID> <RoleItem> customer|(org_unit <Or
1553
1553
  [condition securitygroup|nonsecuritygroup]
1554
1554
  gam delete admin <RoleAssignmentId>
1555
1555
 
1556
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
1557
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
1558
+
1556
1559
  gam print admins [todrive <ToDriveAttribute>*]
1557
1560
  [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1558
1561
  [types <AdminAssigneeTypeList>]
@@ -1,3 +1,21 @@
1
+ 7.24.00
2
+
3
+ If you want to disable a user's service account access to Drive and Sheets but still allow reading command data from Google Docs and Sheets,
4
+ issue the following command and make these settings:
5
+ ```
6
+ gam user user@domain.com update serviceaccount
7
+
8
+ [ ] 20) Drive API (supports readonly)
9
+ [*] 21) Drive API - read command data
10
+ [ ] 42) Sheets API (supports readonly)
11
+ [*] 43) Sheets API - read command data
12
+ ```
13
+
14
+ 7.23.07
15
+
16
+ Fixed bug in `gam print|show admins` where all admin assignments were not displayed when
17
+ `types <AdminAssigneeTypeList>` was not specified, i.e., all assignments should be displayed.
18
+
1
19
  7.23.06
2
20
 
3
21
  Added option `types <AdminAssigneeTypeList>` to `gam print|show admins` that allows filtering
@@ -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.06'
28
+ __version__ = '7.24.00'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -3049,9 +3049,10 @@ def getGDocData(gformat):
3049
3049
  mimeType = GDOC_FORMAT_MIME_TYPES[gformat]
3050
3050
  user = getEmailAddress()
3051
3051
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3052
- user, drive, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity)
3052
+ _, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3053
3053
  if not drive:
3054
3054
  sys.exit(GM.Globals[GM.SYSEXITRC])
3055
+ _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
3055
3056
  if jcount == 0:
3056
3057
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.NO_ENTITIES_FOUND.format(Ent.Singular(Ent.DRIVE_FILE)))
3057
3058
  if jcount > 1:
@@ -3105,14 +3106,15 @@ def getGSheetData():
3105
3106
  user = getEmailAddress()
3106
3107
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3107
3108
  sheetEntity = getSheetEntity(False)
3108
- user, drive, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity)
3109
+ user, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3109
3110
  if not drive:
3110
3111
  sys.exit(GM.Globals[GM.SYSEXITRC])
3112
+ _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
3111
3113
  if jcount == 0:
3112
3114
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.NO_ENTITIES_FOUND.format(Ent.Singular(Ent.DRIVE_FILE)))
3113
3115
  if jcount > 1:
3114
3116
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.MULTIPLE_ENTITIES_FOUND.format(Ent.Plural(Ent.DRIVE_FILE), jcount, ','.join(fileIdEntity['list'])))
3115
- _, sheet = buildGAPIServiceObject(API.SHEETS, user)
3117
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSCD, API.SHEETS), user)
3116
3118
  if not sheet:
3117
3119
  sys.exit(GM.Globals[GM.SYSEXITRC])
3118
3120
  fileId = fileIdEntity['list'][0]
@@ -4801,8 +4803,6 @@ def defaultSvcAcctScopes():
4801
4803
  saScopes[scope['api']].extend(scope['scope'])
4802
4804
  saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
4803
4805
  saScopes[API.DRIVE2] = saScopes[API.DRIVE3]
4804
- saScopes[API.DRIVETD] = saScopes[API.DRIVE3]
4805
- saScopes[API.SHEETSTD] = saScopes[API.SHEETS]
4806
4806
  return saScopes
4807
4807
 
4808
4808
  def _getSvcAcctData():
@@ -5609,6 +5609,12 @@ def getSaUser(user):
5609
5609
  GM.Globals[GM.CURRENT_CLIENT_API_SCOPES] = currentClientAPIScopes
5610
5610
  return userEmail
5611
5611
 
5612
+ def chooseSaAPI(api1, api2):
5613
+ _getSvcAcctData()
5614
+ if api1 in GM.Globals[GM.SVCACCT_SCOPES]:
5615
+ return api1
5616
+ return api2
5617
+
5612
5618
  def buildGAPIServiceObject(api, user, i=0, count=0, displayError=True):
5613
5619
  userEmail = getSaUser(user)
5614
5620
  httpObj = getHttpObj(cache=GM.Globals[GM.CACHE_DIR])
@@ -8030,7 +8036,7 @@ class CSVPrintFile():
8030
8036
 
8031
8037
  def getDriveObject():
8032
8038
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8033
- _, drive = buildGAPIServiceObject(API.DRIVETD, self.todrive['user'])
8039
+ _, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVETD, API.DRIVE3), self.todrive['user'])
8034
8040
  if not drive:
8035
8041
  invalidTodriveUserExit(Ent.USER, Msg.NOT_FOUND)
8036
8042
  else:
@@ -8183,7 +8189,7 @@ class CSVPrintFile():
8183
8189
  if result['mimeType'] != MIMETYPE_GA_SPREADSHEET:
8184
8190
  invalidTodriveFileIdExit([], f'{Msg.NOT_A} {Ent.Singular(Ent.SPREADSHEET)}', tdfileidLocation)
8185
8191
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8186
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, self.todrive['user'])
8192
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), self.todrive['user'])
8187
8193
  if sheet is None:
8188
8194
  invalidTodriveUserExit(Ent.USER, Msg.NOT_FOUND)
8189
8195
  else:
@@ -8696,7 +8702,7 @@ class CSVPrintFile():
8696
8702
  sheetTitle += tdtime.strftime(self.todrive['sheettimeformat'])
8697
8703
  action = Act.Get()
8698
8704
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8699
- user, drive = buildGAPIServiceObject(API.DRIVETD, self.todrive['user'])
8705
+ user, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVETD, API.DRIVE3), self.todrive['user'])
8700
8706
  if not drive:
8701
8707
  closeFile(csvFile)
8702
8708
  return
@@ -8729,7 +8735,7 @@ class CSVPrintFile():
8729
8735
  if result['mimeType'] != MIMETYPE_GA_SPREADSHEET:
8730
8736
  todriveCSVErrorExit(entityValueList, f'{Msg.NOT_A} {Ent.Singular(Ent.SPREADSHEET)}')
8731
8737
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8732
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, user)
8738
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), user)
8733
8739
  if sheet is None:
8734
8740
  return
8735
8741
  else:
@@ -8877,7 +8883,7 @@ class CSVPrintFile():
8877
8883
  (self.todrive['sheetEntity'] or self.todrive['locale'] or self.todrive['timeZone'] or
8878
8884
  self.todrive['sheettitle'] or self.todrive['cellwrap'] or self.todrive['cellnumberformat'])):
8879
8885
  if not GC.Values[GC.TODRIVE_CLIENTACCESS]:
8880
- _, sheet = buildGAPIServiceObject(API.SHEETSTD, user)
8886
+ _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSTD, API.SHEETS), user)
8881
8887
  if sheet is None:
8882
8888
  return
8883
8889
  else:
@@ -16263,7 +16269,7 @@ def _showCustomerLicenseInfo(customerInfo, FJQC):
16263
16269
  while True:
16264
16270
  try:
16265
16271
  result = callGAPI(rep.customerUsageReports(), 'get',
16266
- throwReasons=[GAPI.INVALID, GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
16272
+ throwReasons=[GAPI.INVALID, GAPI.FAILED_PRECONDITION, GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
16267
16273
  date=tryDate, customerId=customerInfo['id'],
16268
16274
  fields='warnings,usageReports', parameters=parameters)
16269
16275
  usageReports = numUsersAvailable(result)
@@ -16276,7 +16282,7 @@ def _showCustomerLicenseInfo(customerInfo, FJQC):
16276
16282
  if fullData == 0:
16277
16283
  continue
16278
16284
  break
16279
- except GAPI.invalid as e:
16285
+ except (GAPI.invalid, GAPI.failedPrecondition) as e:
16280
16286
  tryDate = _adjustTryDate(str(e), 0, -1, tryDate)
16281
16287
  if not tryDate:
16282
16288
  return
@@ -16998,22 +17004,11 @@ ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP = {
16998
17004
  }
16999
17005
  ALL_ASSIGNEE_TYPES = ['user', 'group', 'serviceaccount']
17000
17006
 
17001
- PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId', 'assigneeType']
17007
+ PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId']
17002
17008
  PRINT_ADMIN_TITLES = ['roleAssignmentId', 'roleId', 'role',
17003
17009
  'assignedTo', 'assignedToUser', 'assignedToGroup', 'assignedToServiceAccount', 'assignedToUnknown',
17004
17010
  'scopeType', 'orgUnitId', 'orgUnit']
17005
17011
 
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
-
17017
17012
  # gam print admins [todrive <ToDriveAttribute>*]
17018
17013
  # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
17019
17014
  # [types <AdminAssigneeTypeList>]
@@ -17023,6 +17018,17 @@ def getAssigneeTypes(myarg, typesSet):
17023
17018
  # [types <AdminAssigneeTypeList>]
17024
17019
  # [recursive] [condition] [privileges]
17025
17020
  def doPrintShowAdmins():
17021
+ def _getAssigneeTypes(myarg):
17022
+ if myarg in {'type', 'types'}:
17023
+ for gtype in getString(Cmd.OB_ADMIN_ASSIGNEE_TYPE_LIST).lower().replace(',', ' ').split():
17024
+ if gtype in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17025
+ typesSet.add(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[gtype])
17026
+ else:
17027
+ invalidChoiceExit(gtype, ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP, True)
17028
+ else:
17029
+ return False
17030
+ return True
17031
+
17026
17032
  def _getPrivileges(admin):
17027
17033
  if showPrivileges:
17028
17034
  roleId = admin['roleId']
@@ -17048,13 +17054,11 @@ def doPrintShowAdmins():
17048
17054
  def _setNamesFromIds(admin, privileges):
17049
17055
  admin['role'] = role_from_roleid(admin['roleId'])
17050
17056
  assignedTo = admin['assignedTo']
17057
+ admin['assignedToUnknown'] = False
17051
17058
  if assignedTo not in assignedToIdEmailMap:
17052
- assigneeEmail, assigneeType = convertUIDtoEmailAddressWithType(f'uid:{assignedTo}', cd, sal,
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:
17057
- assignedToField = 'assignedToUnknown'
17059
+ emailTypes = ALL_ASSIGNEE_TYPES if admin.get('assigneeType', '') != 'group' else ['group']
17060
+ assigneeEmail, assigneeType = convertUIDtoEmailAddressWithType(f'uid:{assignedTo}', cd, sal, emailTypes=emailTypes)
17061
+ assignedToField = ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP.get(assigneeType, 'assignedToUnknown')
17058
17062
  if assignedToField == 'assignedToUnknown':
17059
17063
  assigneeEmail = True
17060
17064
  assignedToIdEmailMap[assignedTo] = {'assignedToField': assignedToField, 'assigneeEmail': assigneeEmail}
@@ -17069,17 +17073,22 @@ def doPrintShowAdmins():
17069
17073
  admin['condition'] = 'securitygroup'
17070
17074
  elif admin['condition'] == NONSECURITY_GROUP_CONDITION:
17071
17075
  admin['condition'] = 'nonsecuritygroup'
17076
+ if debug:
17077
+ print('******', admin['assignedTo'], admin.get('assigneeType', 'no type'),
17078
+ admin['assignedToField'], not typesSet or admin['assignedToField'] in typesSet)
17079
+ return not typesSet or admin['assignedToField'] in typesSet
17072
17080
 
17073
17081
  cd = buildGAPIObject(API.DIRECTORY)
17074
17082
  sal = buildGAPIObject(API.SERVICEACCOUNTLOOKUP)
17075
17083
  csvPF = CSVPrintFile(PRINT_ADMIN_TITLES) if Act.csvFormat() else None
17076
17084
  roleId = None
17077
17085
  userKey = None
17078
- oneItemPerRow = recursive = showPrivileges = False
17086
+ debug = oneItemPerRow = recursive = showPrivileges = False
17079
17087
  typesSet = set()
17080
17088
  kwargs = {}
17081
17089
  rolePrivileges = {}
17082
- fieldsList = PRINT_ADMIN_FIELDS
17090
+ allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17091
+ fieldsList = PRINT_ADMIN_FIELDS+['assigneeType']
17083
17092
  assignedToIdEmailMap = {}
17084
17093
  while Cmd.ArgumentsRemaining():
17085
17094
  myarg = getArgument()
@@ -17089,11 +17098,10 @@ def doPrintShowAdmins():
17089
17098
  userKey = kwargs['userKey'] = getEmailAddress()
17090
17099
  elif myarg == 'role':
17091
17100
  _, roleId = getRoleId()
17092
- elif getAssigneeTypes(myarg, typesSet):
17101
+ elif _getAssigneeTypes(myarg):
17093
17102
  pass
17094
17103
  elif myarg == 'recursive':
17095
17104
  recursive = True
17096
- allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17097
17105
  memberOptions = initMemberOptions()
17098
17106
  memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP] = True
17099
17107
  memberOptions[MEMBEROPTION_DISPLAYMATCH] = False
@@ -17108,13 +17116,13 @@ def doPrintShowAdmins():
17108
17116
  showPrivileges = True
17109
17117
  elif myarg == 'oneitemperrow':
17110
17118
  oneItemPerRow = True
17119
+ elif myarg == 'debug':
17120
+ debug = True
17111
17121
  else:
17112
17122
  unknownArgumentExit()
17113
17123
  if roleId and not kwargs:
17114
17124
  kwargs['roleId'] = roleId
17115
17125
  roleId = None
17116
- if not typesSet:
17117
- typesSet = set(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP.values())
17118
17126
  fields = getItemFieldsFromFieldsList('items', fieldsList)
17119
17127
  printGettingAllAccountEntities(Ent.ADMIN_ROLE_ASSIGNMENT)
17120
17128
  try:
@@ -17131,7 +17139,7 @@ def doPrintShowAdmins():
17131
17139
  return
17132
17140
  except GAPI.notFound as e:
17133
17141
  entityActionFailedExit([Ent.ADMIN_ROLE, kwargs['roleId']], str(e))
17134
- except (GAPI.forbidden, GAPI.serviceNotAvailable) as e:
17142
+ except GAPI.serviceNotAvailable as e:
17135
17143
  entityActionFailedExit([Ent.ADMINISTRATOR, userKey], str(e))
17136
17144
  except (GAPI.badRequest, GAPI.customerNotFound):
17137
17145
  accessErrorExit(cd)
@@ -17147,8 +17155,7 @@ def doPrintShowAdmins():
17147
17155
  continue
17148
17156
  assignedTo = admin['assignedTo']
17149
17157
  if admin['assigneeType'] != 'group' or not recursive:
17150
- _setNamesFromIds(admin, _getPrivileges(admin))
17151
- if admin['assignedToField'] in typesSet:
17158
+ if _setNamesFromIds(admin, _getPrivileges(admin)):
17152
17159
  expandedAdmins.append(admin)
17153
17160
  continue
17154
17161
  if assignedTo not in groupMembers:
@@ -17158,10 +17165,8 @@ def doPrintShowAdmins():
17158
17165
  getGroupMembers(cd, assignedTo, allGroupRoles, membersList, membersSet, i, count,
17159
17166
  memberOptions, memberDisplayOptions, level, {Ent.TYPE_USER})
17160
17167
  groupMembers[assignedTo] = membersList[:]
17161
- _setNamesFromIds(admin, _getPrivileges(admin))
17162
- if admin[assignedToIdEmailMap[assignedTo]['assignedToField']] not in typesSet:
17168
+ if not _setNamesFromIds(admin, _getPrivileges(admin)):
17163
17169
  continue
17164
- expandedAdmins.append(admin)
17165
17170
  if not groupMembers[assignedTo]:
17166
17171
  expandedAdmins.append(admin)
17167
17172
  continue
@@ -17184,7 +17189,7 @@ def doPrintShowAdmins():
17184
17189
  Ind.Increment()
17185
17190
  for field in PRINT_ADMIN_TITLES:
17186
17191
  if field in admin:
17187
- if field == 'roleAssignmentId':
17192
+ if (field == 'roleAssignmentId') or (field == 'assignedToUnknown' and not admin[field]):
17188
17193
  continue
17189
17194
  printKeyValueList([field, admin[field]])
17190
17195
  if showPrivileges:
@@ -17199,7 +17204,8 @@ def doPrintShowAdmins():
17199
17204
  Ind.Decrement()
17200
17205
  else:
17201
17206
  for admin in expandedAdmins:
17202
- admin.pop('assignedToField')
17207
+ admin.pop('assigneeType', None)
17208
+ admin.pop('assignedToField', None)
17203
17209
  if not oneItemPerRow or 'rolePrivileges' not in admin:
17204
17210
  csvPF.WriteRowTitles(flattenJSON(admin))
17205
17211
  else:
@@ -60,6 +60,7 @@ DIRECTORY = 'directory'
60
60
  DOCS = 'docs'
61
61
  DRIVE2 = 'drive2'
62
62
  DRIVE3 = 'drive3'
63
+ DRIVECD = 'drivecd'
63
64
  DRIVETD = 'drivetd'
64
65
  DRIVEACTIVITY = 'driveactivity'
65
66
  DRIVELABELS = 'drivelabels'
@@ -91,6 +92,7 @@ SERVICEACCOUNTLOOKUP = 'serviceaccountlookup'
91
92
  SERVICEMANAGEMENT = 'servicemanagement'
92
93
  SERVICEUSAGE = 'serviceusage'
93
94
  SHEETS = 'sheets'
95
+ SHEETSCD = 'sheetscd'
94
96
  SHEETSTD = 'sheetstd'
95
97
  SITEVERIFICATION = 'siteVerification'
96
98
  STORAGE = 'storage'
@@ -253,7 +255,8 @@ _INFO = {
253
255
  DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
254
256
  DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
255
257
  DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
256
- DRIVETD: {'name': 'Drive API v3 - todrive', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
258
+ DRIVECD: {'name': 'Drive API v3 - read command data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
259
+ DRIVETD: {'name': 'Drive API v3 - write todrive data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
257
260
  DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
258
261
  DRIVELABELS_ADMIN: {'name': 'Drive Labels API - Admin', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
259
262
  DRIVELABELS_USER: {'name': 'Drive Labels API - User', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
@@ -283,7 +286,8 @@ _INFO = {
283
286
  SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
284
287
  SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
285
288
  SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
286
- SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
289
+ SHEETSCD: {'name': 'Sheets API - read command data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
290
+ SHEETSTD: {'name': 'Sheets API - write todrive data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
287
291
  SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
288
292
  STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
289
293
  STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
@@ -750,9 +754,15 @@ _SVCACCT_SCOPES = [
750
754
  ]
751
755
 
752
756
  _SVCACCT_SPECIAL_SCOPES = [
753
- {'name': 'Drive API - todrive',
757
+ {'name': 'Drive API - read command data',
758
+ 'api': DRIVECD,
759
+ 'subscopes': [],
760
+ 'offByDefault': True,
761
+ 'scope': DRIVE_SCOPE+'.readonly'},
762
+ {'name': 'Drive API - write todrive data',
754
763
  'api': DRIVETD,
755
764
  'subscopes': [],
765
+ 'offByDefault': True,
756
766
  'scope': DRIVE_SCOPE},
757
767
  {'name': 'Gmail API - Full Access - read only',
758
768
  'api': GMAIL,
@@ -764,8 +774,14 @@ _SVCACCT_SPECIAL_SCOPES = [
764
774
  'subscopes': [],
765
775
  'offByDefault': True,
766
776
  'scope': GMAIL_SEND_SCOPE},
767
- {'name': 'Sheets API - todrive',
777
+ {'name': 'Sheets API - read command data',
778
+ 'api': SHEETSCD,
779
+ 'offByDefault': True,
780
+ 'subscopes': [],
781
+ 'scope': 'https://www.googleapis.com/auth/spreadsheets.readonly'},
782
+ {'name': 'Sheets API - write todrive data',
768
783
  'api': SHEETSTD,
784
+ 'offByDefault': True,
769
785
  'subscopes': [],
770
786
  'scope': 'https://www.googleapis.com/auth/spreadsheets'},
771
787
  ]
@@ -19,6 +19,8 @@
19
19
 
20
20
  ## Definitions
21
21
  ```
22
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
23
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
22
24
  <DomainName> ::= <String>(.<String>)+
23
25
  <EmailAddress> ::= <String>@<DomainName>
24
26
  <GroupItem> ::= <EmailAddress>|<UniqueID>|<String>
@@ -1476,9 +1478,11 @@ gam delete admin <RoleAssignmentId>
1476
1478
  ```
1477
1479
  gam print admins [todrive <ToDriveAttribute>*]
1478
1480
  [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1481
+ [types <AdminAssigneeTypeList>]
1479
1482
  [recursive] [condition] [privileges] [oneitemperrow]
1480
1483
  gam show admins
1481
1484
  [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1485
+ [types <AdminAssigneeTypeList>]
1482
1486
  [recursive] [condition] [privileges]
1483
1487
  ```
1484
1488
  By default, all administrators and roles are displayed; choose from the following
@@ -1486,7 +1490,10 @@ options to limit the display:
1486
1490
  * `user|group <EmailAddress>|<UniqueID>` - Display assignments to this administrator
1487
1491
  * `role <RoleItem>` - Display only administrators with this role
1488
1492
 
1489
- By default, assignments to security groups are shown as a single item; use `recursive`
1493
+ By default, all admin assignee types are displayed. use `types <AdminAssigneeTypeList>` to filter
1494
+ admin assignments by the type of the assignee.
1495
+
1496
+ By default, assignments to security groups are displayed as a single item; use `recursive`
1490
1497
  to display assignments to the members of the security groups; the security group membershop is recursively expanded.
1491
1498
 
1492
1499
  * `condition` - Display any conditions associated with a role assignment
@@ -265,6 +265,7 @@
265
265
  ## Named items
266
266
  ```
267
267
  <AccessToken> ::= <String>
268
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
268
269
  <AlertID> ::= <String>
269
270
  <APIScopeURL> ::= <String>
270
271
  <APPID> ::= <String>
@@ -10,6 +10,20 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
10
10
 
11
11
  See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
12
12
 
13
+ ### 7.23.07
14
+
15
+ Fixed bug in `gam print|show admins` where all admin assignments were not displayed when
16
+ `types <AdminAssigneeTypeList>` was not specified, i.e., all assignments should be displayed.
17
+
18
+ ### 7.23.06
19
+
20
+ Added option `types <AdminAssigneeTypeList>` to `gam print|show admins` that allows filtering
21
+ of admin assignments by the type of the assignee; by default, all assignee types are displayed.
22
+ ```
23
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
24
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
25
+ ```
26
+
13
27
  ### 7.23.05
14
28
 
15
29
  Added option `recursive` to `gam print|show admins` that will display assignments to the members
@@ -252,7 +252,7 @@ writes the credentials into the file oauth2.txt.
252
252
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
253
253
  admin@server:/Users/admin$ gam version
254
254
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
255
- GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.23.07 - https://github.com/GAM-team/GAM - pyinstaller
256
256
  GAM Team <google-apps-manager@googlegroups.com>
257
257
  Python 3.13.7 64-bit final
258
258
  macOS Tahoe 26.0.1 x86_64
@@ -990,7 +990,7 @@ writes the credentials into the file oauth2.txt.
990
990
  C:\>del C:\GAMConfig\oauth2.txt
991
991
  C:\>gam version
992
992
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
993
- GAM 7.22.00 - https://github.com/GAM-team/GAM - pythonsource
993
+ GAM 7.23.07 - https://github.com/GAM-team/GAM - pythonsource
994
994
  GAM Team <google-apps-manager@googlegroups.com>
995
995
  Python 3.13.7 64-bit final
996
996
  Windows-10-10.0.17134 AMD64
@@ -5,6 +5,7 @@
5
5
 
6
6
  ## Lists of basic items
7
7
  ```
8
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
8
9
  <APIScopeURLList> ::= "<APIScopeURL>(,<APIScopeURL>)*"
9
10
  <ASPIDList> ::= "<ASPID>(,<ASPID>)*"
10
11
  <AssetTagList> ::= "<AssetTag>(,<AssetTag>)*"
@@ -27,7 +27,7 @@
27
27
  - [Delete Vault Saved Queries](#delete-vault-saved-queries)
28
28
  - [Display Vault Saved Queries](#display-vault-saved-queries)
29
29
  - [Takeout](#takeout)
30
- - [Copy a Takeout Bucket](#copy-a-takeoutbucket)
30
+ - [Copy a Takeout Bucket](#copy-a-takeout-bucket)
31
31
  - [Download a Takeout Bucket](#download-a-takeout-bucket)
32
32
 
33
33
  ## API documentation
@@ -848,7 +848,7 @@ gam create vaultquery <MatterItem> [name <String>]
848
848
  [<JSONData>]
849
849
  [shownames]
850
850
  [showdetails|returnidonly|formatjson]
851
- ``
851
+ ```
852
852
 
853
853
  If `name <String>` is omitted, the query is named `GAM <corpus> Query - <Time>`
854
854
 
@@ -928,7 +928,7 @@ Select fields to display:
928
928
 
929
929
  The `shownames` argument controls whether org unit and shared drive names are displayed in queries; additional API calls are required to get the names.
930
930
 
931
- # Takeout
931
+ ## Takeout
932
932
  Many thanks to Jay for these commands and documentation.
933
933
 
934
934
  GAM 6.42.00 and newer support copying and downloading Google Cloud Storage (GCS) buckets generated by [organization-wide Takeout](https://support.google.com/a/answer/100458?hl=en).
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.23.07 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
8
  Python 3.13.7 64-bit final
9
9
  macOS Tahoe 26.0.1 x86_64
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
15
15
  Print the current version of Gam with details and time offset information
16
16
  ```
17
17
  gam version timeoffset
18
- GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.23.07 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
20
  Python 3.13.7 64-bit final
21
21
  macOS Tahoe 26.0.1 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
27
27
  Print the current version of Gam with extended details and SSL information
28
28
  ```
29
29
  gam version extended
30
- GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.23.07 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
32
  Python 3.13.7 64-bit final
33
33
  macOS Tahoe 26.0.1 x86_64
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes