gam7 7.8.2__tar.gz → 7.9.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 (318) hide show
  1. {gam7-7.8.2 → gam7-7.9.0}/.github/workflows/build.yml +1 -1
  2. {gam7-7.8.2 → gam7-7.9.0}/PKG-INFO +1 -1
  3. {gam7-7.8.2 → gam7-7.9.0}/src/GamUpdate.txt +26 -0
  4. {gam7-7.8.2 → gam7-7.9.0}/src/callgam.py +1 -1
  5. {gam7-7.8.2 → gam7-7.9.0}/src/gam/__init__.py +56 -22
  6. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glapi.py +12 -5
  7. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glcfg.py +4 -0
  8. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glmsgs.py +4 -3
  9. {gam7-7.8.2 → gam7-7.9.0}/src/gam.py +1 -1
  10. {gam7-7.8.2 → gam7-7.9.0}/wiki/GamUpdates.md +44 -0
  11. {gam7-7.8.2 → gam7-7.9.0}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +4 -4
  12. {gam7-7.8.2 → gam7-7.9.0}/wiki/Shared-Drives.md +7 -5
  13. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Shared-Drives.md +7 -5
  14. {gam7-7.8.2 → gam7-7.9.0}/wiki/Version-and-Help.md +10 -10
  15. {gam7-7.8.2 → gam7-7.9.0}/wiki/gam.cfg.md +10 -0
  16. {gam7-7.8.2 → gam7-7.9.0}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  17. {gam7-7.8.2 → gam7-7.9.0}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  18. {gam7-7.8.2 → gam7-7.9.0}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  19. {gam7-7.8.2 → gam7-7.9.0}/.github/ISSUE_TEMPLATE.txt +0 -0
  20. {gam7-7.8.2 → gam7-7.9.0}/.github/actions/decrypt.sh +0 -0
  21. {gam7-7.8.2 → gam7-7.9.0}/.github/actions/entitlements.plist +0 -0
  22. {gam7-7.8.2 → gam7-7.9.0}/.github/actions/package_exclusions.txt +0 -0
  23. {gam7-7.8.2 → gam7-7.9.0}/.github/stale.yml +0 -0
  24. {gam7-7.8.2 → gam7-7.9.0}/.github/workflows/codeql-analysis.yml +0 -0
  25. {gam7-7.8.2 → gam7-7.9.0}/.github/workflows/get-cacerts.yml +0 -0
  26. {gam7-7.8.2 → gam7-7.9.0}/.github/workflows/pushwiki.yml +0 -0
  27. {gam7-7.8.2 → gam7-7.9.0}/.github/workflows/pypi.yml +0 -0
  28. {gam7-7.8.2 → gam7-7.9.0}/.pre-commit-config.yaml +0 -0
  29. {gam7-7.8.2 → gam7-7.9.0}/LICENSE +0 -0
  30. {gam7-7.8.2 → gam7-7.9.0}/README.md +0 -0
  31. {gam7-7.8.2 → gam7-7.9.0}/pyproject.toml +0 -0
  32. {gam7-7.8.2 → gam7-7.9.0}/src/.gitignore +0 -0
  33. {gam7-7.8.2 → gam7-7.9.0}/src/GamCommands.txt +0 -0
  34. {gam7-7.8.2 → gam7-7.9.0}/src/LICENSE +0 -0
  35. {gam7-7.8.2 → gam7-7.9.0}/src/cacerts.pem +0 -0
  36. {gam7-7.8.2 → gam7-7.9.0}/src/gam/__main__.py +0 -0
  37. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/__init__.py +0 -0
  38. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/auth.py +0 -0
  39. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/client.py +0 -0
  40. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/core.py +0 -0
  41. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/data.py +0 -0
  42. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/http.py +0 -0
  43. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/http_core.py +0 -0
  44. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/http_interface.py +0 -0
  45. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/mock_http.py +0 -0
  46. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/mock_http_core.py +0 -0
  47. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/mock_service.py +0 -0
  48. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/service.py +0 -0
  49. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/token_store.py +0 -0
  50. {gam7-7.8.2 → gam7-7.9.0}/src/gam/atom/url.py +0 -0
  51. {gam7-7.8.2 → gam7-7.9.0}/src/gam/cacerts.pem +0 -0
  52. {gam7-7.8.2 → gam7-7.9.0}/src/gam/cbcm-v1.1beta1.json +0 -0
  53. {gam7-7.8.2 → gam7-7.9.0}/src/gam/contactdelegation-v1.json +0 -0
  54. {gam7-7.8.2 → gam7-7.9.0}/src/gam/datastudio-v1.json +0 -0
  55. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/__init__.py +0 -0
  56. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glaction.py +0 -0
  57. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glclargs.py +0 -0
  58. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glentity.py +0 -0
  59. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glgapi.py +0 -0
  60. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glgdata.py +0 -0
  61. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glglobals.py +0 -0
  62. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glindent.py +0 -0
  63. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glskus.py +0 -0
  64. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.8.2 → gam7-7.9.0}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/__init__.py +0 -0
  80. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/_auth.py +0 -0
  81. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/_helpers.py +0 -0
  82. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/channel.py +0 -0
  83. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/discovery.py +0 -0
  84. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  85. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  86. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  87. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  88. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/errors.py +0 -0
  89. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/http.py +0 -0
  90. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/mimeparse.py +0 -0
  91. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/model.py +0 -0
  92. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/schema.py +0 -0
  93. {gam7-7.8.2 → gam7-7.9.0}/src/gam/googleapiclient/version.py +0 -0
  94. {gam7-7.8.2 → gam7-7.9.0}/src/gam/iso8601/__init__.py +0 -0
  95. {gam7-7.8.2 → gam7-7.9.0}/src/gam/iso8601/iso8601.py +0 -0
  96. {gam7-7.8.2 → gam7-7.9.0}/src/gam/meet-v2beta.json +0 -0
  97. {gam7-7.8.2 → gam7-7.9.0}/src/gam/serviceaccountlookup-v1.json +0 -0
  98. {gam7-7.8.2 → gam7-7.9.0}/src/gam/six.py +0 -0
  99. {gam7-7.8.2 → gam7-7.9.0}/src/gam-install.sh +0 -0
  100. {gam7-7.8.2 → gam7-7.9.0}/src/gam-setup.bat +0 -0
  101. {gam7-7.8.2 → gam7-7.9.0}/src/gam.exe.manifest +0 -0
  102. {gam7-7.8.2 → gam7-7.9.0}/src/gam.spec +0 -0
  103. {gam7-7.8.2 → gam7-7.9.0}/src/gam.wxs +0 -0
  104. {gam7-7.8.2 → gam7-7.9.0}/src/license.rtf +0 -0
  105. {gam7-7.8.2 → gam7-7.9.0}/src/requirements-dev.txt +0 -0
  106. {gam7-7.8.2 → gam7-7.9.0}/src/requirements.txt +0 -0
  107. {gam7-7.8.2 → gam7-7.9.0}/src/setup.cfg +0 -0
  108. {gam7-7.8.2 → gam7-7.9.0}/src/setup.py +0 -0
  109. {gam7-7.8.2 → gam7-7.9.0}/src/tools/a_atleast_b.py +0 -0
  110. {gam7-7.8.2 → gam7-7.9.0}/src/tools/gen-wix-xml-filelist.py +0 -0
  111. {gam7-7.8.2 → gam7-7.9.0}/src/tools/mkGamRef.py +0 -0
  112. {gam7-7.8.2 → gam7-7.9.0}/src/tools/openssl.props +0 -0
  113. {gam7-7.8.2 → gam7-7.9.0}/src/version_info.txt.in +0 -0
  114. {gam7-7.8.2 → gam7-7.9.0}/wiki/00scratch.md +0 -0
  115. {gam7-7.8.2 → gam7-7.9.0}/wiki/Addresses.md +0 -0
  116. {gam7-7.8.2 → gam7-7.9.0}/wiki/Administrators.md +0 -0
  117. {gam7-7.8.2 → gam7-7.9.0}/wiki/Alert-Center.md +0 -0
  118. {gam7-7.8.2 → gam7-7.9.0}/wiki/Aliases.md +0 -0
  119. {gam7-7.8.2 → gam7-7.9.0}/wiki/Authorization.md +0 -0
  120. {gam7-7.8.2 → gam7-7.9.0}/wiki/BNF-Syntax.md +0 -0
  121. {gam7-7.8.2 → gam7-7.9.0}/wiki/Basic-Items.md +0 -0
  122. {gam7-7.8.2 → gam7-7.9.0}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.8.2 → gam7-7.9.0}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.8.2 → gam7-7.9.0}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.8.2 → gam7-7.9.0}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.8.2 → gam7-7.9.0}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.8.2 → gam7-7.9.0}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.8.2 → gam7-7.9.0}/wiki/Calendars.md +0 -0
  129. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chat-Bot.md +0 -0
  130. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-AUE-Counts.md +0 -0
  131. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  132. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Installed-Apps.md +0 -0
  133. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  134. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Policies.md +0 -0
  135. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Printers.md +0 -0
  136. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Profile-Management.md +0 -0
  137. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Version-Counts.md +0 -0
  138. {gam7-7.8.2 → gam7-7.9.0}/wiki/Chrome-Version-History.md +0 -0
  139. {gam7-7.8.2 → gam7-7.9.0}/wiki/ChromeOS-Devices.md +0 -0
  140. {gam7-7.8.2 → gam7-7.9.0}/wiki/Classroom-Courses.md +0 -0
  141. {gam7-7.8.2 → gam7-7.9.0}/wiki/Classroom-Guardians.md +0 -0
  142. {gam7-7.8.2 → gam7-7.9.0}/wiki/Classroom-Invitations.md +0 -0
  143. {gam7-7.8.2 → gam7-7.9.0}/wiki/Classroom-Membership.md +0 -0
  144. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Channel.md +0 -0
  145. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Identity-Devices.md +0 -0
  146. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  147. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Identity-Groups.md +0 -0
  148. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Identity-Policies.md +0 -0
  149. {gam7-7.8.2 → gam7-7.9.0}/wiki/Cloud-Storage.md +0 -0
  150. {gam7-7.8.2 → gam7-7.9.0}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  151. {gam7-7.8.2 → gam7-7.9.0}/wiki/Collections-of-Items.md +0 -0
  152. {gam7-7.8.2 → gam7-7.9.0}/wiki/Collections-of-Users.md +0 -0
  153. {gam7-7.8.2 → gam7-7.9.0}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  154. {gam7-7.8.2 → gam7-7.9.0}/wiki/Command-Line-Parsing.md +0 -0
  155. {gam7-7.8.2 → gam7-7.9.0}/wiki/Command-Logging-Progress.md +0 -0
  156. {gam7-7.8.2 → gam7-7.9.0}/wiki/Context-Aware-Access-Levels.md +0 -0
  157. {gam7-7.8.2 → gam7-7.9.0}/wiki/Customer.md +0 -0
  158. {gam7-7.8.2 → gam7-7.9.0}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  159. {gam7-7.8.2 → gam7-7.9.0}/wiki/Domain-SharedContacts.md +0 -0
  160. {gam7-7.8.2 → gam7-7.9.0}/wiki/Domains-Verification.md +0 -0
  161. {gam7-7.8.2 → gam7-7.9.0}/wiki/Domains.md +0 -0
  162. {gam7-7.8.2 → gam7-7.9.0}/wiki/Downloads-Installs.md +0 -0
  163. {gam7-7.8.2 → gam7-7.9.0}/wiki/Drive-File-Selection.md +0 -0
  164. {gam7-7.8.2 → gam7-7.9.0}/wiki/Drive-Items.md +0 -0
  165. {gam7-7.8.2 → gam7-7.9.0}/wiki/Drive-REST-API-v3.md +0 -0
  166. {gam7-7.8.2 → gam7-7.9.0}/wiki/Email-Audit-Monitor.md +0 -0
  167. {gam7-7.8.2 → gam7-7.9.0}/wiki/Find-File-Owner.md +0 -0
  168. {gam7-7.8.2 → gam7-7.9.0}/wiki/GAM-Public-Chat-Room.md +0 -0
  169. {gam7-7.8.2 → gam7-7.9.0}/wiki/GAM-Return-Codes.md +0 -0
  170. {gam7-7.8.2 → gam7-7.9.0}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  171. {gam7-7.8.2 → gam7-7.9.0}/wiki/GAM7-on-Android-Devices.md +0 -0
  172. {gam7-7.8.2 → gam7-7.9.0}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  173. {gam7-7.8.2 → gam7-7.9.0}/wiki/Google-Data-Transfers.md +0 -0
  174. {gam7-7.8.2 → gam7-7.9.0}/wiki/Google-Network-Addresses.md +0 -0
  175. {gam7-7.8.2 → gam7-7.9.0}/wiki/Groups-Membership.md +0 -0
  176. {gam7-7.8.2 → gam7-7.9.0}/wiki/Groups.md +0 -0
  177. {gam7-7.8.2 → gam7-7.9.0}/wiki/HTTPS-Proxy.md +0 -0
  178. {gam7-7.8.2 → gam7-7.9.0}/wiki/Home.md +0 -0
  179. {gam7-7.8.2 → gam7-7.9.0}/wiki/How-to-Install-GAM7.md +0 -0
  180. {gam7-7.8.2 → gam7-7.9.0}/wiki/How-to-Uninstall-GAM7.md +0 -0
  181. {gam7-7.8.2 → gam7-7.9.0}/wiki/How-to-Update-GAM7.md +0 -0
  182. {gam7-7.8.2 → gam7-7.9.0}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  183. {gam7-7.8.2 → gam7-7.9.0}/wiki/Inbound-SSO.md +0 -0
  184. {gam7-7.8.2 → gam7-7.9.0}/wiki/Install-GAM-as-Python-Library.md +0 -0
  185. {gam7-7.8.2 → gam7-7.9.0}/wiki/Licenses.md +0 -0
  186. {gam7-7.8.2 → gam7-7.9.0}/wiki/List-Items.md +0 -0
  187. {gam7-7.8.2 → gam7-7.9.0}/wiki/List.md +0 -0
  188. {gam7-7.8.2 → gam7-7.9.0}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  189. {gam7-7.8.2 → gam7-7.9.0}/wiki/Mobile-Devices.md +0 -0
  190. {gam7-7.8.2 → gam7-7.9.0}/wiki/Organizational-Units.md +0 -0
  191. {gam7-7.8.2 → gam7-7.9.0}/wiki/Other-Resources.md +0 -0
  192. {gam7-7.8.2 → gam7-7.9.0}/wiki/Permission-Matches.md +0 -0
  193. {gam7-7.8.2 → gam7-7.9.0}/wiki/Python-Regular-Expressions.md +0 -0
  194. {gam7-7.8.2 → gam7-7.9.0}/wiki/README.md +0 -0
  195. {gam7-7.8.2 → gam7-7.9.0}/wiki/Rclone.md +0 -0
  196. {gam7-7.8.2 → gam7-7.9.0}/wiki/Reports.md +0 -0
  197. {gam7-7.8.2 → gam7-7.9.0}/wiki/Reseller.md +0 -0
  198. {gam7-7.8.2 → gam7-7.9.0}/wiki/Resources.md +0 -0
  199. {gam7-7.8.2 → gam7-7.9.0}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  200. {gam7-7.8.2 → gam7-7.9.0}/wiki/SSL-Root-CA-Certificates.md +0 -0
  201. {gam7-7.8.2 → gam7-7.9.0}/wiki/Schemas.md +0 -0
  202. {gam7-7.8.2 → gam7-7.9.0}/wiki/Scripts.md +0 -0
  203. {gam7-7.8.2 → gam7-7.9.0}/wiki/Send-Email.md +0 -0
  204. {gam7-7.8.2 → gam7-7.9.0}/wiki/Sites.md +0 -0
  205. {gam7-7.8.2 → gam7-7.9.0}/wiki/Tag-Replace.md +0 -0
  206. {gam7-7.8.2 → gam7-7.9.0}/wiki/Todrive.md +0 -0
  207. {gam7-7.8.2 → gam7-7.9.0}/wiki/Unmanaged-Accounts.md +0 -0
  208. {gam7-7.8.2 → gam7-7.9.0}/wiki/Upgrade-Benefits.md +0 -0
  209. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Analytics-Admin.md +0 -0
  210. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Application-Specific-Passwords.md +0 -0
  211. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Backup-Verification-Codes.md +0 -0
  212. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Calendars-Access.md +0 -0
  213. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Calendars-Events.md +0 -0
  214. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Calendars.md +0 -0
  215. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Chat.md +0 -0
  216. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Classification-Labels.md +0 -0
  217. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Classroom-Profile.md +0 -0
  218. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Contacts-Delegates.md +0 -0
  219. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Contacts.md +0 -0
  220. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Deprovision.md +0 -0
  221. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Activity-Settings.md +0 -0
  222. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Cleanup.md +0 -0
  223. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Comments.md +0 -0
  224. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Copy-Move.md +0 -0
  225. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Files-Display.md +0 -0
  226. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Files-Manage.md +0 -0
  227. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Orphans.md +0 -0
  228. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Ownership.md +0 -0
  229. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Permissions.md +0 -0
  230. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Query.md +0 -0
  231. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Revisions.md +0 -0
  232. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Shortcuts.md +0 -0
  233. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Drive-Transfer.md +0 -0
  234. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Forms.md +0 -0
  235. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-CSE.md +0 -0
  236. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Delegates.md +0 -0
  237. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Filters.md +0 -0
  238. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Forwarding.md +0 -0
  239. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Labels.md +0 -0
  240. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  241. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Profile.md +0 -0
  242. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-S-MIME.md +0 -0
  243. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  244. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Gmail-Settings.md +0 -0
  245. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Group-Membership.md +0 -0
  246. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Keep-Notes.md +0 -0
  247. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Looker-Studio.md +0 -0
  248. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Meet.md +0 -0
  249. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-People-Contacts-Profiles.md +0 -0
  250. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Photo.md +0 -0
  251. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Profile-Photo.md +0 -0
  252. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Profile-Sharing.md +0 -0
  253. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  254. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Spreadsheets.md +0 -0
  255. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Tasks.md +0 -0
  256. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-Tokens.md +0 -0
  257. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users-YouTube.md +0 -0
  258. {gam7-7.8.2 → gam7-7.9.0}/wiki/Users.md +0 -0
  259. {gam7-7.8.2 → gam7-7.9.0}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  260. {gam7-7.8.2 → gam7-7.9.0}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  261. {gam7-7.8.2 → gam7-7.9.0}/wiki/Vault-Takeout.md +0 -0
  262. {gam7-7.8.2 → gam7-7.9.0}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  263. {gam7-7.8.2 → gam7-7.9.0}/wiki/_Sidebar.md +0 -0
  264. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Home.md +0 -0
  303. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Printers.md +0 -0
  312. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.8.2 → gam7-7.9.0}/wiki/l-_Footer.md +0 -0
@@ -126,7 +126,7 @@ jobs:
126
126
  with:
127
127
  path: |
128
128
  cache.tar.xz
129
- key: gam-${{ matrix.jid }}-20250422
129
+ key: gam-${{ matrix.jid }}-20250603
130
130
 
131
131
  - name: Untar Cache archive
132
132
  if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.8.2
3
+ Version: 7.9.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
@@ -1,3 +1,29 @@
1
+ 7.09.00
2
+
3
+ Removed the overly broad service account `IAM and Access Management API` scope `https://www.googleapis.com/auth/cloud-platform`
4
+ from DWD. The `gam <UserTypeEntity> check|Update serviceaccount` commands issue an error message if this scope
5
+ is enabled prompting you to update your service account authorization so that the scope can be removed.
6
+
7
+ GAM commands that need IAM access now use the more limited scope `https://www.googleapis.com/auth/iam` in a non-DWD manner.
8
+
9
+ Added `enforce_expansive_access` Boolean variable to `gam.cfg` that provides the default value
10
+ for option `enforceexpansiveaccess` in all commands that delete or update drive file ACLs/permissions.
11
+ It's default value is False.
12
+ ```
13
+ gam <UserTypeEntity> delete permissions
14
+ gam <UserTypeEntity> delete drivefileacl
15
+ gam <UserTypeEntity> update drivefileacl
16
+ gam <UserTypeEntity> copy drivefile
17
+ gam <UserTypeEntity> move drivefile
18
+ gam <UserTypeEntity> transfer ownership
19
+ gam <UserTypeEntity> claim ownership
20
+ gam <UserTypeEntity> transfer drive
21
+ ```
22
+
23
+ Fixed bug in `gam print shareddriveorganizers` that caused a trap when an organizer was a deleted user.
24
+
25
+ Updated to Python 3.13.4
26
+
1
27
  7.08.02
2
28
 
3
29
  Updated the defaults in `gam print shareddriveorganizers` to match the most common use case, not the script.
@@ -11,7 +11,7 @@ if __name__ == '__main__':
11
11
  # One time initialization
12
12
  if platform.system() != 'Linux':
13
13
  multiprocessing.freeze_support()
14
- multiprocessing.set_start_method('spawn')
14
+ multiprocessing.set_start_method('spawn', force=True)
15
15
  initializeLogging()
16
16
  #
17
17
  CallGAMCommand(['gam', 'version'])
@@ -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.08.02'
28
+ __version__ = '7.09.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
@@ -4785,8 +4785,9 @@ def defaultSvcAcctScopes():
4785
4785
  scopesList = API.getSvcAcctScopesList(GC.Values[GC.USER_SERVICE_ACCOUNT_ACCESS_ONLY], False)
4786
4786
  saScopes = {}
4787
4787
  for scope in scopesList:
4788
- saScopes.setdefault(scope['api'], [])
4789
- saScopes[scope['api']].append(scope['scope'])
4788
+ if not scope.get('offByDefault'):
4789
+ saScopes.setdefault(scope['api'], [])
4790
+ saScopes[scope['api']].append(scope['scope'])
4790
4791
  saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
4791
4792
  saScopes[API.DRIVE2] = saScopes[API.DRIVE3]
4792
4793
  saScopes[API.DRIVETD] = saScopes[API.DRIVE3]
@@ -12232,7 +12233,7 @@ def checkServiceAccount(users):
12232
12233
 
12233
12234
  def authorizeScopes(message):
12234
12235
  long_url = ('https://admin.google.com/ac/owl/domainwidedelegation'
12235
- f'?clientScopeToAdd={",".join(checkScopes)}'
12236
+ f'?clientScopeToAdd={",".join(sorted(checkScopes))}'
12236
12237
  f'&clientIdToAdd={service_account}&overwriteClientId=true')
12237
12238
  if GC.Values[GC.DOMAIN]:
12238
12239
  long_url += f'&dn={GC.Values[GC.DOMAIN]}'
@@ -12244,10 +12245,12 @@ def checkServiceAccount(users):
12244
12245
  allScopes = API.getSvcAcctScopes(GC.Values[GC.USER_SERVICE_ACCOUNT_ACCESS_ONLY], Act.Get() == Act.UPDATE)
12245
12246
  checkScopesSet = set()
12246
12247
  saScopes = {}
12248
+ checkDeprecatedScopes = True
12247
12249
  useColor = False
12248
12250
  while Cmd.ArgumentsRemaining():
12249
12251
  myarg = getArgument()
12250
12252
  if myarg in {'scope', 'scopes'}:
12253
+ checkDeprecatedScopes = False
12251
12254
  for scope in getString(Cmd.OB_API_SCOPE_URL_LIST).lower().replace(',', ' ').split():
12252
12255
  api = API.getSvcAcctScopeAPI(scope)
12253
12256
  if api is not None:
@@ -12264,10 +12267,12 @@ def checkServiceAccount(users):
12264
12267
  testPass = createGreenText('PASS')
12265
12268
  testFail = createRedText('FAIL')
12266
12269
  testWarn = createYellowText('WARN')
12270
+ testDeprecated = createRedText('DEPRECATED')
12267
12271
  else:
12268
12272
  testPass = 'PASS'
12269
12273
  testFail = 'FAIL'
12270
12274
  testWarn = 'WARN'
12275
+ testDeprecated = 'DEPRECATED'
12271
12276
  if Act.Get() == Act.CHECK:
12272
12277
  if not checkScopesSet:
12273
12278
  for scope in iter(GM.Globals[GM.SVCACCT_SCOPES].values()):
@@ -12275,7 +12280,7 @@ def checkServiceAccount(users):
12275
12280
  else:
12276
12281
  if not checkScopesSet:
12277
12282
  scopesList = API.getSvcAcctScopesList(GC.Values[GC.USER_SERVICE_ACCOUNT_ACCESS_ONLY], True)
12278
- selectedScopes = getScopesFromUser(scopesList, False, GM.Globals[GM.SVCACCT_SCOPES])
12283
+ selectedScopes = getScopesFromUser(scopesList, False, GM.Globals[GM.SVCACCT_SCOPES] if GM.Globals[GM.SVCACCT_SCOPES_DEFINED] else None)
12279
12284
  if selectedScopes is None:
12280
12285
  return False
12281
12286
  i = 0
@@ -12337,7 +12342,7 @@ def checkServiceAccount(users):
12337
12342
  if saTokenStatus == testFail:
12338
12343
  invalidOauth2serviceJsonExit(f'Authentication{auth_error}')
12339
12344
  _getSvcAcctData() # needed to read in GM.OAUTH2SERVICE_JSON_DATA
12340
- if GM.Globals[GM.SVCACCT_SCOPES_DEFINED] and API.IAM not in GM.Globals[GM.SVCACCT_SCOPES]:
12345
+ if API.IAM not in GM.Globals[GM.SVCACCT_SCOPES]:
12341
12346
  GM.Globals[GM.SVCACCT_SCOPES][API.IAM] = [API.IAM_SCOPE]
12342
12347
  key_type = GM.Globals[GM.OAUTH2SERVICE_JSON_DATA].get('key_type', 'default')
12343
12348
  if key_type == 'default':
@@ -12399,6 +12404,38 @@ def checkServiceAccount(users):
12399
12404
  allScopesPass = False
12400
12405
  printPassFail(scope, f'{scopeStatus}{currentCount(j, jcount)}')
12401
12406
  Ind.Decrement()
12407
+ if checkDeprecatedScopes:
12408
+ deprecatedScopes = sorted(API.DEPRECATED_SCOPES)
12409
+ jcount = len(deprecatedScopes)
12410
+ printKeyValueListWithCount([Msg.DEPRECATED_SCOPES, '',
12411
+ Ent.Singular(Ent.USER), user,
12412
+ Ent.Choose(Ent.SCOPE, jcount), jcount],
12413
+ i, count)
12414
+ Ind.Increment()
12415
+ j = 0
12416
+ for scope in deprecatedScopes:
12417
+ j += 1
12418
+ # try with and without email scope
12419
+ for scopes in [[scope, API.USERINFO_EMAIL_SCOPE], [scope]]:
12420
+ try:
12421
+ credentials = getSvcAcctCredentials(scopes, user)
12422
+ credentials.refresh(request)
12423
+ break
12424
+ except (httplib2.HttpLib2Error, google.auth.exceptions.TransportError, RuntimeError) as e:
12425
+ handleServerError(e)
12426
+ except google.auth.exceptions.RefreshError:
12427
+ continue
12428
+ if credentials.token:
12429
+ token_info = callGAPI(oa2, 'tokeninfo', access_token=credentials.token)
12430
+ if scope in token_info.get('scope', '').split(' ') and user == token_info.get('email', user).lower():
12431
+ scopeStatus = testDeprecated
12432
+ allScopesPass = False
12433
+ else:
12434
+ scopeStatus = testPass
12435
+ else:
12436
+ scopeStatus = testPass
12437
+ printPassFail(scope, f'{scopeStatus}{currentCount(j, jcount)}')
12438
+ Ind.Decrement()
12402
12439
  service_account = GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['client_id']
12403
12440
  if allScopesPass:
12404
12441
  if Act.Get() == Act.CHECK:
@@ -58716,7 +58753,7 @@ def initCopyMoveOptions(copyCmd):
58716
58753
  'showPermissionMessages': False,
58717
58754
  'sendEmailIfRequired': False,
58718
58755
  'useDomainAdminAccess': False,
58719
- 'enforceExpansiveAccess': False,
58756
+ 'enforceExpansiveAccess': GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS],
58720
58757
  'copiedShortcutsPointToCopiedFiles': True,
58721
58758
  'createShortcutsForNonmovableFiles': False,
58722
58759
  'duplicateFiles': DUPLICATE_FILE_OVERWRITE_OLDER,
@@ -62096,7 +62133,8 @@ def transferDrive(users):
62096
62133
  targetUserFolderPattern = '#user# old files'
62097
62134
  targetUserOrphansFolderPattern = '#user# orphaned files'
62098
62135
  targetIds = [None, None]
62099
- createShortcutsForNonmovableFiles = enforceExpansiveAccess = False
62136
+ createShortcutsForNonmovableFiles = False
62137
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
62100
62138
  mergeWithTarget = False
62101
62139
  thirdPartyOwners = {}
62102
62140
  skipFileIdEntity = initDriveFileEntity()
@@ -62402,7 +62440,8 @@ def transferOwnership(users):
62402
62440
  body = {}
62403
62441
  newOwner = getEmailAddress()
62404
62442
  OBY = OrderBy(DRIVEFILE_ORDERBY_CHOICE_MAP)
62405
- changeParents = enforceExpansiveAccess = filepath = includeTrashed = noRecursion = False
62443
+ changeParents = filepath = includeTrashed = noRecursion = False
62444
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
62406
62445
  pathDelimiter = '/'
62407
62446
  csvPF = fileTree = None
62408
62447
  addParents = ''
@@ -62728,7 +62767,8 @@ def claimOwnership(users):
62728
62767
  onlyOwners = set()
62729
62768
  skipOwners = set()
62730
62769
  subdomains = []
62731
- enforceExpansiveAccess = filepath = includeTrashed = False
62770
+ filepath = includeTrashed = False
62771
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
62732
62772
  pathDelimiter = '/'
62733
62773
  addParents = ''
62734
62774
  parentBody = {}
@@ -63503,7 +63543,7 @@ def doCreateDriveFileACL():
63503
63543
  def updateDriveFileACLs(users, useDomainAdminAccess=False):
63504
63544
  fileIdEntity = getDriveFileEntity()
63505
63545
  isEmail, permissionId = getPermissionId()
63506
- enforceExpansiveAccess = None
63546
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
63507
63547
  removeExpiration = showTitles = updateSheetProtectedRanges = False
63508
63548
  showDetails = True
63509
63549
  csvPF = None
@@ -63541,9 +63581,6 @@ def updateDriveFileACLs(users, useDomainAdminAccess=False):
63541
63581
  _checkFileIdEntityDomainAccess(fileIdEntity, useDomainAdminAccess)
63542
63582
  if 'role' not in body:
63543
63583
  missingArgumentExit(f'role {formatChoiceList(DRIVEFILE_ACL_ROLES_MAP)}')
63544
- updateKwargs = {'useDomainAdminAccess': useDomainAdminAccess}
63545
- if enforceExpansiveAccess is not None:
63546
- updateKwargs['enforceExpansiveAccess'] = enforceExpansiveAccess
63547
63584
  printKeys, timeObjects = _getDriveFileACLPrintKeysTimeObjects()
63548
63585
  if csvPF and showTitles:
63549
63586
  csvPF.AddTitles(fileNameTitle)
@@ -63581,7 +63618,7 @@ def updateDriveFileACLs(users, useDomainAdminAccess=False):
63581
63618
  permission = callGAPI(drive.permissions(), 'update',
63582
63619
  bailOnInternalError=True,
63583
63620
  throwReasons=GAPI.DRIVE_ACCESS_THROW_REASONS+GAPI.DRIVE3_UPDATE_ACL_THROW_REASONS+[GAPI.FILE_NEVER_WRITABLE],
63584
- **updateKwargs,
63621
+ useDomainAdminAccess=useDomainAdminAccess, enforceExpansiveAccess=enforceExpansiveAccess,
63585
63622
  fileId=fileId, permissionId=permissionId, removeExpiration=removeExpiration,
63586
63623
  transferOwnership=body.get('role', '') == 'owner', body=body, fields='*', supportsAllDrives=True)
63587
63624
  if updateSheetProtectedRanges and mimeType == MIMETYPE_GA_SPREADSHEET:
@@ -63832,7 +63869,7 @@ def doCreatePermissions():
63832
63869
  def deleteDriveFileACLs(users, useDomainAdminAccess=False):
63833
63870
  fileIdEntity = getDriveFileEntity()
63834
63871
  isEmail, permissionId = getPermissionId()
63835
- enforceExpansiveAccess = None
63872
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
63836
63873
  showTitles = updateSheetProtectedRanges = False
63837
63874
  while Cmd.ArgumentsRemaining():
63838
63875
  myarg = getArgument()
@@ -63847,9 +63884,6 @@ def deleteDriveFileACLs(users, useDomainAdminAccess=False):
63847
63884
  else:
63848
63885
  unknownArgumentExit()
63849
63886
  _checkFileIdEntityDomainAccess(fileIdEntity, useDomainAdminAccess)
63850
- deleteKwargs = {'useDomainAdminAccess': useDomainAdminAccess}
63851
- if enforceExpansiveAccess is not None:
63852
- deleteKwargs['enforceExpansiveAccess'] = enforceExpansiveAccess
63853
63887
  i, count, users = getEntityArgument(users)
63854
63888
  for user in users:
63855
63889
  i += 1
@@ -63882,7 +63916,7 @@ def deleteDriveFileACLs(users, useDomainAdminAccess=False):
63882
63916
  break
63883
63917
  callGAPI(drive.permissions(), 'delete',
63884
63918
  throwReasons=GAPI.DRIVE_ACCESS_THROW_REASONS+GAPI.DRIVE3_DELETE_ACL_THROW_REASONS+[GAPI.FILE_NEVER_WRITABLE],
63885
- **deleteKwargs,
63919
+ useDomainAdminAccess=useDomainAdminAccess, enforceExpansiveAccess=enforceExpansiveAccess,
63886
63920
  fileId=fileId, permissionId=permissionId, supportsAllDrives=True)
63887
63921
  entityActionPerformed([Ent.USER, user, entityType, fileName, Ent.PERMISSION_ID, permissionId], j, jcount)
63888
63922
  if updateSheetProtectedRanges and mimeType == MIMETYPE_GA_SPREADSHEET:
@@ -63961,7 +63995,7 @@ def deletePermissions(users, useDomainAdminAccess=False):
63961
63995
  jsonData = getJSON([])
63962
63996
  PM = PermissionMatch()
63963
63997
  PM.SetDefaultMatch(False, {'role': 'owner'})
63964
- enforceExpansiveAccess = False
63998
+ enforceExpansiveAccess = GC.Values[GC.ENFORCE_EXPANSIVE_ACCESS]
63965
63999
  while Cmd.ArgumentsRemaining():
63966
64000
  myarg = getArgument()
63967
64001
  if myarg in ADMIN_ACCESS_OPTIONS:
@@ -66200,7 +66234,7 @@ def printSharedDriveOrganizers(users, useDomainAdminAccess=False):
66200
66234
  useDomainAdminAccess=useDomainAdminAccess,
66201
66235
  fileId=shareddrive['id'], fields=fields, supportsAllDrives=True)
66202
66236
  for permission in permissions:
66203
- if permission['type'] in includeTypes and permission['role'] in roles:
66237
+ if permission['type'] in includeTypes and permission['role'] in roles and permission.get('emailAddress', ''):
66204
66238
  if domainList:
66205
66239
  _, domain = permission['emailAddress'].lower().split('@', 1)
66206
66240
  if domain not in domainList:
@@ -118,6 +118,7 @@ JWT_APIS = {
118
118
  ACCESSCONTEXTMANAGER: [CLOUD_PLATFORM_SCOPE],
119
119
  CHAT: ['https://www.googleapis.com/auth/chat.bot'],
120
120
  CLOUDRESOURCEMANAGER: [CLOUD_PLATFORM_SCOPE],
121
+ IAM: [IAM_SCOPE],
121
122
  ORGPOLICY: [CLOUD_PLATFORM_SCOPE],
122
123
  }
123
124
  #
@@ -131,6 +132,12 @@ APIS_NEEDING_ACCESS_TOKEN = {
131
132
  CBCM: ['https://www.googleapis.com/auth/admin.directory.device.chromebrowsers']
132
133
  }
133
134
  #
135
+ DEPRECATED_SCOPES = {
136
+ 'https://www.googleapis.com/auth/cloud-identity',
137
+ 'https://www.googleapis.com/auth/cloud-platform',
138
+ 'https://www.googleapis.com/auth/iam',
139
+ }
140
+ #
134
141
  REFRESH_PERM_ERRORS = [
135
142
  'invalid_grant: reauth related error (rapt_required)', # no way to reauth today
136
143
  'invalid_grant: Token has been expired or revoked',
@@ -645,11 +652,11 @@ _SVCACCT_SCOPES = [
645
652
  'api': GMAIL,
646
653
  'subscopes': [],
647
654
  'scope': 'https://www.googleapis.com/auth/gmail.settings.sharing'},
648
- {'name': 'Identity and Access Management API',
649
- 'api': IAM,
650
- 'offByDefault': True,
651
- 'subscopes': [],
652
- 'scope': IAM_SCOPE},
655
+ # {'name': 'Identity and Access Management API',
656
+ # 'api': IAM,
657
+ # 'offByDefault': True,
658
+ # 'subscopes': [],
659
+ # 'scope': CLOUD_PLATFORM_SCOPE},
653
660
  {'name': 'Keep API',
654
661
  'api': KEEP,
655
662
  'subscopes': READONLY,
@@ -163,6 +163,8 @@ EMAIL_BATCH_SIZE = 'email_batch_size'
163
163
  ENABLE_DASA = 'enable_dasa'
164
164
  # Enable Cloud Session Reauthentication by borrowing a RAPT token from gcloud command
165
165
  ENABLE_GCLOUD_REAUTH = 'enable_gcloud_reauth'
166
+ # Value for enforceExpansiveAccess for commands that delete or update drive file ACLs/permissions.
167
+ ENFORCE_EXPANSIVE_ACCESS = 'enforce_expansive_access'
166
168
  # When retrieving lists of calendar events from API, how many should be retrieved in each chunk
167
169
  EVENT_MAX_RESULTS = 'event_max_results'
168
170
  # Path to extra_args.txt
@@ -377,6 +379,7 @@ Defaults = {
377
379
  DEVICE_MAX_RESULTS: '200',
378
380
  DOMAIN: '',
379
381
  DRIVE_DIR: '',
382
+ ENFORCE_EXPANSIVE_ACCESS: FALSE,
380
383
  DRIVE_MAX_RESULTS: '1000',
381
384
  DRIVE_V3_BETA: FALSE,
382
385
  DRIVE_V3_NATIVE_NAMES: TRUE,
@@ -545,6 +548,7 @@ VAR_INFO = {
545
548
  DEVICE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
546
549
  DOMAIN: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'GA_DOMAIN', VAR_LIMITS: (0, None)},
547
550
  DRIVE_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMDRIVEDIR'},
551
+ ENFORCE_EXPANSIVE_ACCESS: {VAR_TYPE: TYPE_BOOLEAN},
548
552
  DRIVE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
549
553
  DRIVE_V3_BETA: {VAR_TYPE: TYPE_BOOLEAN},
550
554
  DRIVE_V3_NATIVE_NAMES: {VAR_TYPE: TYPE_BOOLEAN},
@@ -140,12 +140,13 @@ SERVICE_ACCOUNT_PRIVATE_KEY_AGE = 'Service Account Private Key age: {0} days'
140
140
  SERVICE_ACCOUNT_SKIPPING_KEY_AGE_CHECK = 'Skipping Private Key age check: {0} rotation not necessary'
141
141
  UPDATE_PROJECT_TO_VIEW_MANAGE_SAKEYS = 'Please run "gam update project" to view/manage service account keys'
142
142
  DOMAIN_WIDE_DELEGATION_AUTHENTICATION = 'Domain-wide Delegation authentication'
143
+ DEPRECATED_SCOPES = 'Deprecated scopes that GAM should NEVER have DwD access to'
143
144
  SCOPE_AUTHORIZATION_PASSED = '''All scopes PASSED!
144
145
 
145
146
  Service Account Client name: {0} is fully authorized.
146
147
  '''
147
148
  SCOPE_AUTHORIZATION_UPDATE_PASSED = '''All scopes PASSED!
148
- To authorize them (in case some scopes were unselected), please go to the following link in your browser:
149
+ To update authorization (in case some scopes were unselected), please go to the following link in your browser:
149
150
  {0}
150
151
  {1}
151
152
 
@@ -156,8 +157,8 @@ Click AUTHORIZE
156
157
  When the box closes you're done
157
158
  After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
158
159
  '''
159
- SCOPE_AUTHORIZATION_FAILED = '''Some scopes FAILED!
160
- To authorize them, please go to the following link in your browser:
160
+ SCOPE_AUTHORIZATION_FAILED = '''Some scopes FAILED or should be DISABLED!
161
+ To update authorization, please go to the following link in your browser:
161
162
  {0}
162
163
  {1}
163
164
 
@@ -11,5 +11,5 @@ from gam.__main__ import main
11
11
  if __name__ == '__main__':
12
12
  if platform.system() != 'Linux':
13
13
  multiprocessing.freeze_support()
14
- multiprocessing.set_start_method('spawn')
14
+ multiprocessing.set_start_method('spawn', force=True)
15
15
  main()
@@ -10,6 +10,50 @@ 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.09.00
14
+
15
+ Removed the overly broad service account `IAM and Access Management API` scope `https://www.googleapis.com/auth/cloud-platform`
16
+ from DWD. The `gam <UserTypeEntity> check|Update serviceaccount` commands issue an error message if this scope
17
+ is enabled prompting you to update your service account authorization so that the scope can be removed.
18
+
19
+ GAM commands that need IAM access now use the more limited scope `https://www.googleapis.com/auth/iam` in a non-DWD manner.
20
+
21
+ Added `enforce_expansive_access` Boolean variable to `gam.cfg` that provides the default value
22
+ for option `enforceexpansiveaccess` in all commands that delete or update drive file ACLs/permissions.
23
+ It's default value is False.
24
+ ```
25
+ gam <UserTypeEntity> delete permissions
26
+ gam <UserTypeEntity> delete drivefileacl
27
+ gam <UserTypeEntity> update drivefileacl
28
+ gam <UserTypeEntity> copy drivefile
29
+ gam <UserTypeEntity> move drivefile
30
+ gam <UserTypeEntity> transfer ownership
31
+ gam <UserTypeEntity> claim ownership
32
+ gam <UserTypeEntity> transfer drive
33
+ ```
34
+
35
+ Fixed bug in `gam print shareddriveorganizers` that caused a trap when an organizer was a deleted user.
36
+
37
+ Updated to Python 3.13.4
38
+
39
+ ### 7.08.02
40
+
41
+ Updated the defaults in `gam print shareddriveorganizers` to match the most common use case, not the script.
42
+
43
+ * `domainlist` - The workspace primary domain
44
+ * `includetypes` - user
45
+ * `oneorganizer` - True
46
+ * `shownoorganizerdrives` - True
47
+ * `includefileorganizers` - False
48
+
49
+ To select organizers from any domain, use: `domainlist ""`
50
+
51
+ These commands produce the same result.
52
+ ```
53
+ gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers domainlist mydomain.com includetypes user oneorganizer shownoorganizerdrives
54
+ gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers
55
+ ```
56
+
13
57
  ### 7.08.01
14
58
 
15
59
  Added option `shareddrives (<SharedDriveIDList>|(select <FileSelector>|<CSVFileSelector>))` to
@@ -251,9 +251,9 @@ writes the credentials into the file oauth2.txt.
251
251
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
252
252
  admin@server:/Users/admin$ gam version
253
253
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
254
- GAM 7.08.01 - https://github.com/GAM-team/GAM - pyinstaller
254
+ GAM 7.09.00 - https://github.com/GAM-team/GAM - pyinstaller
255
255
  GAM Team <google-apps-manager@googlegroups.com>
256
- Python 3.13.3 64-bit final
256
+ Python 3.13.4 64-bit final
257
257
  MacOS Sequoia 15.5 x86_64
258
258
  Path: /Users/admin/bin/gam7
259
259
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -989,9 +989,9 @@ writes the credentials into the file oauth2.txt.
989
989
  C:\>del C:\GAMConfig\oauth2.txt
990
990
  C:\>gam version
991
991
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
992
- GAM 7.08.01 - https://github.com/GAM-team/GAM - pythonsource
992
+ GAM 7.09.00 - https://github.com/GAM-team/GAM - pythonsource
993
993
  GAM Team <google-apps-manager@googlegroups.com>
994
- Python 3.13.3 64-bit final
994
+ Python 3.13.4 64-bit final
995
995
  Windows-10-10.0.17134 AMD64
996
996
  Path: C:\GAM7
997
997
  Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -443,16 +443,18 @@ By default, organizers for all Shared Drives are displayed; use the following op
443
443
  For multiple organizers:
444
444
  * `delimiter <Character>` - Separate `organizers` entries with `<Character>`; the default value is `csv_output_field_delimiter` from `gam.cfg`.
445
445
 
446
- The command defaults match the script defaults:
447
- * `domainlist` - All domains
448
- * `includetypes` - user,group
449
- * `oneorganizer` - False
446
+ The command defaults do not match the script defaults, they are set for the most common use case:
447
+ * `domainlist` - The workspace primary domain
448
+ * `includetypes` - user
449
+ * `oneorganizer` - True
450
450
  * `shownoorganizerdrives` - True
451
451
  * `includefileorganizers` - False
452
452
 
453
+ To select organizers from any domain, use: `domainlist ""`
454
+
453
455
  For example, to get a single user organizer from your domain for all Shared Drives including no organizer drives:
454
456
  ```
455
- gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers domainlist mydomain.com includetypes user oneorganizer shownoorganizerdrives
457
+ gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers
456
458
  ```
457
459
 
458
460
  ## Display all Shared Drives with no members
@@ -421,16 +421,18 @@ By default, organizers for all Shared Drives are displayed; use the following op
421
421
  For multiple organizers:
422
422
  * `delimiter <Character>` - Separate `organizers` entries with `<Character>`; the default value is `csv_output_field_delimiter` from `gam.cfg`.
423
423
 
424
- The command defaults match the script defaults:
425
- * `domainlist` - All domains
426
- * `includetypes` - user,group
427
- * `oneorganizer` - False
424
+ The command defaults do not match the script defaults, they are set for the most common use case:
425
+ * `domainlist` - The workspace primary domain
426
+ * `includetypes` - user
427
+ * `oneorganizer` - True
428
428
  * `shownoorganizerdrives` - True
429
429
  * `includefileorganizers` - False
430
430
 
431
+ To select organizers from any domain, use: `domainlist ""`
432
+
431
433
  For example, to get a single user organizer from your domain for all Shared Drives including no organizer drives:
432
434
  ```
433
- gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers domainlist mydomain.com includetypes user oneorganizer shownoorganizerdrives
435
+ gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers
434
436
  ```
435
437
 
436
438
  ## Manage Shared Drive access
@@ -3,9 +3,9 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.08.01 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.09.00 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
- Python 3.13.3 64-bit final
8
+ Python 3.13.4 64-bit final
9
9
  MacOS Sequoia 15.5 x86_64
10
10
  Path: /Users/Admin/bin/gam7
11
11
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -15,9 +15,9 @@ 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.08.01 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.09.00 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
- Python 3.13.3 64-bit final
20
+ Python 3.13.4 64-bit final
21
21
  MacOS Sequoia 15.5 x86_64
22
22
  Path: /Users/Admin/bin/gam7
23
23
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -27,9 +27,9 @@ 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.08.01 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.09.00 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
- Python 3.13.3 64-bit final
32
+ Python 3.13.4 64-bit final
33
33
  MacOS Sequoia 15.5 x86_64
34
34
  Path: /Users/Admin/bin/gam7
35
35
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
64
64
  Path: /Users/Admin/bin/gam7
65
65
  Version Check:
66
66
  Current: 5.35.08
67
- Latest: 7.08.01
67
+ Latest: 7.09.00
68
68
  echo $?
69
69
  1
70
70
  ```
@@ -72,7 +72,7 @@ echo $?
72
72
  Print the current version number without details
73
73
  ```
74
74
  gam version simple
75
- 7.08.01
75
+ 7.09.00
76
76
  ```
77
77
  In Linux/MacOS you can do:
78
78
  ```
@@ -82,9 +82,9 @@ echo $VER
82
82
  Print the current version of Gam and address of this Wiki
83
83
  ```
84
84
  gam help
85
- GAM 7.08.01 - https://github.com/GAM-team/GAM
85
+ GAM 7.09.00 - https://github.com/GAM-team/GAM
86
86
  GAM Team <google-apps-manager@googlegroups.com>
87
- Python 3.13.3 64-bit final
87
+ Python 3.13.4 64-bit final
88
88
  MacOS Sequoia 15.5 x86_64
89
89
  Path: /Users/Admin/bin/gam7
90
90
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -328,6 +328,16 @@ enable_dasa
328
328
  admin_email, customer_id and domain must be set when enable_dasa is True,
329
329
  customer_id may not be set to my_customer
330
330
  Signal file: OldGamPath/enabledasa.txt
331
+ enforce_expansive_access
332
+ The default value for option `enforceexpansiveaccess` in all commands that delete or update drive file ACLs/permissions.
333
+ gam <UserTypeEntity> delete permissions
334
+ gam <UserTypeEntity> delete drivefileacl
335
+ gam <UserTypeEntity> update drivefileacl
336
+ gam <UserTypeEntity> copy drivefile
337
+ gam <UserTypeEntity> move drivefile
338
+ gam <UserTypeEntity> transfer ownership
339
+ gam <UserTypeEntity> claim ownership
340
+ Default: False
331
341
  event_max_results
332
342
  When retrieving lists of Calendar events from API,
333
343
  how many should be retrieved in each API call
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