gam7 7.24.1__tar.gz → 7.25.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.24.1 → gam7-7.25.0}/.github/workflows/build.yml +1 -1
  2. {gam7-7.24.1 → gam7-7.25.0}/PKG-INFO +1 -1
  3. {gam7-7.24.1 → gam7-7.25.0}/src/GamUpdate.txt +21 -0
  4. {gam7-7.24.1 → gam7-7.25.0}/src/gam/__init__.py +30 -19
  5. {gam7-7.24.1 → gam7-7.25.0}/src/gam/__main__.py +6 -1
  6. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glapi.py +28 -22
  7. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glcfg.py +4 -0
  8. {gam7-7.24.1 → gam7-7.25.0}/wiki/GamUpdates.md +8 -0
  9. {gam7-7.24.1 → gam7-7.25.0}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  10. {gam7-7.24.1 → gam7-7.25.0}/wiki/Version-and-Help.md +3 -3
  11. {gam7-7.24.1 → gam7-7.25.0}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  12. {gam7-7.24.1 → gam7-7.25.0}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  13. {gam7-7.24.1 → gam7-7.25.0}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  14. {gam7-7.24.1 → gam7-7.25.0}/.github/ISSUE_TEMPLATE.txt +0 -0
  15. {gam7-7.24.1 → gam7-7.25.0}/.github/actions/decrypt.sh +0 -0
  16. {gam7-7.24.1 → gam7-7.25.0}/.github/actions/entitlements.plist +0 -0
  17. {gam7-7.24.1 → gam7-7.25.0}/.github/actions/package_exclusions.txt +0 -0
  18. {gam7-7.24.1 → gam7-7.25.0}/.github/stale.yml +0 -0
  19. {gam7-7.24.1 → gam7-7.25.0}/.github/workflows/codeql-analysis.yml +0 -0
  20. {gam7-7.24.1 → gam7-7.25.0}/.github/workflows/get-cacerts.yml +0 -0
  21. {gam7-7.24.1 → gam7-7.25.0}/.github/workflows/pushwiki.yml +0 -0
  22. {gam7-7.24.1 → gam7-7.25.0}/.github/workflows/pypi.yml +0 -0
  23. {gam7-7.24.1 → gam7-7.25.0}/LICENSE +0 -0
  24. {gam7-7.24.1 → gam7-7.25.0}/README.md +0 -0
  25. {gam7-7.24.1 → gam7-7.25.0}/pyproject.toml +0 -0
  26. {gam7-7.24.1 → gam7-7.25.0}/src/.gitignore +0 -0
  27. {gam7-7.24.1 → gam7-7.25.0}/src/GamCommands.txt +0 -0
  28. {gam7-7.24.1 → gam7-7.25.0}/src/LICENSE +0 -0
  29. {gam7-7.24.1 → gam7-7.25.0}/src/README.md +0 -0
  30. {gam7-7.24.1 → gam7-7.25.0}/src/callgam.py +0 -0
  31. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/__init__.py +0 -0
  32. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/auth.py +0 -0
  33. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/client.py +0 -0
  34. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/core.py +0 -0
  35. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/data.py +0 -0
  36. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/http.py +0 -0
  37. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/http_core.py +0 -0
  38. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/http_interface.py +0 -0
  39. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/mock_http.py +0 -0
  40. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/mock_http_core.py +0 -0
  41. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/mock_service.py +0 -0
  42. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/service.py +0 -0
  43. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/token_store.py +0 -0
  44. {gam7-7.24.1 → gam7-7.25.0}/src/gam/atom/url.py +0 -0
  45. {gam7-7.24.1 → gam7-7.25.0}/src/gam/cacerts.pem +0 -0
  46. {gam7-7.24.1 → gam7-7.25.0}/src/gam/cbcm-v1.1beta1.json +0 -0
  47. {gam7-7.24.1 → gam7-7.25.0}/src/gam/contactdelegation-v1.json +0 -0
  48. {gam7-7.24.1 → gam7-7.25.0}/src/gam/datastudio-v1.json +0 -0
  49. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/__init__.py +0 -0
  50. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glaction.py +0 -0
  51. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glclargs.py +0 -0
  52. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glentity.py +0 -0
  53. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glgapi.py +0 -0
  54. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glgdata.py +0 -0
  55. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glglobals.py +0 -0
  56. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glindent.py +0 -0
  57. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glmsgs.py +0 -0
  58. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glskus.py +0 -0
  59. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/gluprop.py +0 -0
  60. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/glverlibs.py +0 -0
  61. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gamlib/yubikey.py +0 -0
  62. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/__init__.py +0 -0
  63. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/alt/__init__.py +0 -0
  64. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/alt/app_engine.py +0 -0
  65. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/alt/appengine.py +0 -0
  66. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/__init__.py +0 -0
  67. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/audit/__init__.py +0 -0
  68. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/audit/service.py +0 -0
  69. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  70. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/contacts/service.py +0 -0
  71. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/apps/service.py +0 -0
  72. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/service.py +0 -0
  73. {gam7-7.24.1 → gam7-7.25.0}/src/gam/gdata/urlfetch.py +0 -0
  74. {gam7-7.24.1 → gam7-7.25.0}/src/gam/meet-v2beta.json +0 -0
  75. {gam7-7.24.1 → gam7-7.25.0}/src/gam/serviceaccountlookup-v1.json +0 -0
  76. {gam7-7.24.1 → gam7-7.25.0}/src/gam-install.sh +0 -0
  77. {gam7-7.24.1 → gam7-7.25.0}/src/gam-setup.bat +0 -0
  78. {gam7-7.24.1 → gam7-7.25.0}/src/gam.exe.manifest +0 -0
  79. {gam7-7.24.1 → gam7-7.25.0}/src/gam.py +0 -0
  80. {gam7-7.24.1 → gam7-7.25.0}/src/gam.spec +0 -0
  81. {gam7-7.24.1 → gam7-7.25.0}/src/gam.wxs +0 -0
  82. {gam7-7.24.1 → gam7-7.25.0}/src/license.rtf +0 -0
  83. {gam7-7.24.1 → gam7-7.25.0}/src/tools/a_atleast_b.py +0 -0
  84. {gam7-7.24.1 → gam7-7.25.0}/src/tools/gen-wix-xml-filelist.py +0 -0
  85. {gam7-7.24.1 → gam7-7.25.0}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  86. {gam7-7.24.1 → gam7-7.25.0}/src/tools/hooks/hook-httplib2.py +0 -0
  87. {gam7-7.24.1 → gam7-7.25.0}/src/tools/mkGamRef.py +0 -0
  88. {gam7-7.24.1 → gam7-7.25.0}/src/tools/openssl.props +0 -0
  89. {gam7-7.24.1 → gam7-7.25.0}/src/tools/ssd.mjs +0 -0
  90. {gam7-7.24.1 → gam7-7.25.0}/src/version_info.txt.in +0 -0
  91. {gam7-7.24.1 → gam7-7.25.0}/wiki/00scratch.md +0 -0
  92. {gam7-7.24.1 → gam7-7.25.0}/wiki/Addresses.md +0 -0
  93. {gam7-7.24.1 → gam7-7.25.0}/wiki/Administrators.md +0 -0
  94. {gam7-7.24.1 → gam7-7.25.0}/wiki/Alert-Center.md +0 -0
  95. {gam7-7.24.1 → gam7-7.25.0}/wiki/Aliases.md +0 -0
  96. {gam7-7.24.1 → gam7-7.25.0}/wiki/Authorization.md +0 -0
  97. {gam7-7.24.1 → gam7-7.25.0}/wiki/BNF-Syntax.md +0 -0
  98. {gam7-7.24.1 → gam7-7.25.0}/wiki/Basic-Items.md +0 -0
  99. {gam7-7.24.1 → gam7-7.25.0}/wiki/Bulk-Processing.md +0 -0
  100. {gam7-7.24.1 → gam7-7.25.0}/wiki/Business-Account-Management.md +0 -0
  101. {gam7-7.24.1 → gam7-7.25.0}/wiki/CSV-Input-Filtering.md +0 -0
  102. {gam7-7.24.1 → gam7-7.25.0}/wiki/CSV-Output-Filtering.md +0 -0
  103. {gam7-7.24.1 → gam7-7.25.0}/wiki/CSV-Special-Characters.md +0 -0
  104. {gam7-7.24.1 → gam7-7.25.0}/wiki/Calendars-Access.md +0 -0
  105. {gam7-7.24.1 → gam7-7.25.0}/wiki/Calendars-Events.md +0 -0
  106. {gam7-7.24.1 → gam7-7.25.0}/wiki/Calendars.md +0 -0
  107. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chat-Bot-Setup-Use.md +0 -0
  108. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-AUE-Counts.md +0 -0
  109. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  110. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Installed-Apps.md +0 -0
  111. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  112. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Policies.md +0 -0
  113. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Printers.md +0 -0
  114. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Profile-Management.md +0 -0
  115. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Version-Counts.md +0 -0
  116. {gam7-7.24.1 → gam7-7.25.0}/wiki/Chrome-Version-History.md +0 -0
  117. {gam7-7.24.1 → gam7-7.25.0}/wiki/ChromeOS-Devices.md +0 -0
  118. {gam7-7.24.1 → gam7-7.25.0}/wiki/Classroom-Courses.md +0 -0
  119. {gam7-7.24.1 → gam7-7.25.0}/wiki/Classroom-Guardians.md +0 -0
  120. {gam7-7.24.1 → gam7-7.25.0}/wiki/Classroom-Invitations.md +0 -0
  121. {gam7-7.24.1 → gam7-7.25.0}/wiki/Classroom-Membership.md +0 -0
  122. {gam7-7.24.1 → gam7-7.25.0}/wiki/Classroom-StudentGroups.md +0 -0
  123. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Channel.md +0 -0
  124. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Identity-Devices.md +0 -0
  125. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  126. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Identity-Groups.md +0 -0
  127. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Identity-Policies.md +0 -0
  128. {gam7-7.24.1 → gam7-7.25.0}/wiki/Cloud-Storage.md +0 -0
  129. {gam7-7.24.1 → gam7-7.25.0}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  130. {gam7-7.24.1 → gam7-7.25.0}/wiki/Collections-of-Items.md +0 -0
  131. {gam7-7.24.1 → gam7-7.25.0}/wiki/Collections-of-Users.md +0 -0
  132. {gam7-7.24.1 → gam7-7.25.0}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  133. {gam7-7.24.1 → gam7-7.25.0}/wiki/Command-Line-Parsing.md +0 -0
  134. {gam7-7.24.1 → gam7-7.25.0}/wiki/Command-Logging-Progress.md +0 -0
  135. {gam7-7.24.1 → gam7-7.25.0}/wiki/Context-Aware-Access-Levels.md +0 -0
  136. {gam7-7.24.1 → gam7-7.25.0}/wiki/Customer.md +0 -0
  137. {gam7-7.24.1 → gam7-7.25.0}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  138. {gam7-7.24.1 → gam7-7.25.0}/wiki/Domain-SharedContacts.md +0 -0
  139. {gam7-7.24.1 → gam7-7.25.0}/wiki/Domains-Verification.md +0 -0
  140. {gam7-7.24.1 → gam7-7.25.0}/wiki/Domains.md +0 -0
  141. {gam7-7.24.1 → gam7-7.25.0}/wiki/Downloads-Installs.md +0 -0
  142. {gam7-7.24.1 → gam7-7.25.0}/wiki/Drive-File-Selection.md +0 -0
  143. {gam7-7.24.1 → gam7-7.25.0}/wiki/Drive-Items.md +0 -0
  144. {gam7-7.24.1 → gam7-7.25.0}/wiki/Drive-REST-API-v3.md +0 -0
  145. {gam7-7.24.1 → gam7-7.25.0}/wiki/Email-Audit-Monitor.md +0 -0
  146. {gam7-7.24.1 → gam7-7.25.0}/wiki/Find-File-Owner.md +0 -0
  147. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM-Public-Chat-Room.md +0 -0
  148. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM-Release-Process.md +0 -0
  149. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM-Return-Codes.md +0 -0
  150. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  151. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM7-FAQ.md +0 -0
  152. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM7-on-Android-Devices.md +0 -0
  153. {gam7-7.24.1 → gam7-7.25.0}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  154. {gam7-7.24.1 → gam7-7.25.0}/wiki/Global-Address-List.md +0 -0
  155. {gam7-7.24.1 → gam7-7.25.0}/wiki/Google-Data-Transfers.md +0 -0
  156. {gam7-7.24.1 → gam7-7.25.0}/wiki/Google-Network-Addresses.md +0 -0
  157. {gam7-7.24.1 → gam7-7.25.0}/wiki/Groups-Membership.md +0 -0
  158. {gam7-7.24.1 → gam7-7.25.0}/wiki/Groups.md +0 -0
  159. {gam7-7.24.1 → gam7-7.25.0}/wiki/HTTPS-Proxy.md +0 -0
  160. {gam7-7.24.1 → gam7-7.25.0}/wiki/Home.md +0 -0
  161. {gam7-7.24.1 → gam7-7.25.0}/wiki/How-to-Install-GAM7.md +0 -0
  162. {gam7-7.24.1 → gam7-7.25.0}/wiki/How-to-Uninstall-GAM7.md +0 -0
  163. {gam7-7.24.1 → gam7-7.25.0}/wiki/How-to-Update-GAM7.md +0 -0
  164. {gam7-7.24.1 → gam7-7.25.0}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  165. {gam7-7.24.1 → gam7-7.25.0}/wiki/Inbound-SSO.md +0 -0
  166. {gam7-7.24.1 → gam7-7.25.0}/wiki/Install-GAM-as-Python-Library.md +0 -0
  167. {gam7-7.24.1 → gam7-7.25.0}/wiki/Licenses.md +0 -0
  168. {gam7-7.24.1 → gam7-7.25.0}/wiki/List-Items.md +0 -0
  169. {gam7-7.24.1 → gam7-7.25.0}/wiki/List.md +0 -0
  170. {gam7-7.24.1 → gam7-7.25.0}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  171. {gam7-7.24.1 → gam7-7.25.0}/wiki/Mobile-Devices.md +0 -0
  172. {gam7-7.24.1 → gam7-7.25.0}/wiki/Organizational-Units.md +0 -0
  173. {gam7-7.24.1 → gam7-7.25.0}/wiki/Other-Resources.md +0 -0
  174. {gam7-7.24.1 → gam7-7.25.0}/wiki/Permission-Matches.md +0 -0
  175. {gam7-7.24.1 → gam7-7.25.0}/wiki/Python-Regular-Expressions.md +0 -0
  176. {gam7-7.24.1 → gam7-7.25.0}/wiki/README.md +0 -0
  177. {gam7-7.24.1 → gam7-7.25.0}/wiki/Rclone.md +0 -0
  178. {gam7-7.24.1 → gam7-7.25.0}/wiki/Reports.md +0 -0
  179. {gam7-7.24.1 → gam7-7.25.0}/wiki/Reseller.md +0 -0
  180. {gam7-7.24.1 → gam7-7.25.0}/wiki/Resources.md +0 -0
  181. {gam7-7.24.1 → gam7-7.25.0}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  182. {gam7-7.24.1 → gam7-7.25.0}/wiki/SSL-Root-CA-Certificates.md +0 -0
  183. {gam7-7.24.1 → gam7-7.25.0}/wiki/Schemas.md +0 -0
  184. {gam7-7.24.1 → gam7-7.25.0}/wiki/Scripts.md +0 -0
  185. {gam7-7.24.1 → gam7-7.25.0}/wiki/Send-Email.md +0 -0
  186. {gam7-7.24.1 → gam7-7.25.0}/wiki/Shared-Drives.md +0 -0
  187. {gam7-7.24.1 → gam7-7.25.0}/wiki/Sites.md +0 -0
  188. {gam7-7.24.1 → gam7-7.25.0}/wiki/Tag-Replace.md +0 -0
  189. {gam7-7.24.1 → gam7-7.25.0}/wiki/Todrive.md +0 -0
  190. {gam7-7.24.1 → gam7-7.25.0}/wiki/Unmanaged-Accounts.md +0 -0
  191. {gam7-7.24.1 → gam7-7.25.0}/wiki/Upgrade-Benefits.md +0 -0
  192. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Analytics-Admin.md +0 -0
  193. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Application-Specific-Passwords.md +0 -0
  194. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Backup-Verification-Codes.md +0 -0
  195. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Calendars-Access.md +0 -0
  196. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Calendars-Events.md +0 -0
  197. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Calendars.md +0 -0
  198. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Chat.md +0 -0
  199. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Classification-Labels.md +0 -0
  200. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Classroom-Profile.md +0 -0
  201. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Contacts-Delegates.md +0 -0
  202. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Contacts.md +0 -0
  203. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Deprovision.md +0 -0
  204. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Activity-Settings.md +0 -0
  205. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Cleanup.md +0 -0
  206. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Comments.md +0 -0
  207. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Copy-Move.md +0 -0
  208. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Files-Display.md +0 -0
  209. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Files-Manage.md +0 -0
  210. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Orphans.md +0 -0
  211. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Ownership.md +0 -0
  212. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Permissions.md +0 -0
  213. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Query.md +0 -0
  214. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Revisions.md +0 -0
  215. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Shortcuts.md +0 -0
  216. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Drive-Transfer.md +0 -0
  217. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Forms.md +0 -0
  218. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-CSE.md +0 -0
  219. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Delegates.md +0 -0
  220. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Filters.md +0 -0
  221. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Forwarding.md +0 -0
  222. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Labels.md +0 -0
  223. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  224. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Profile.md +0 -0
  225. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-S-MIME.md +0 -0
  226. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  227. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Gmail-Settings.md +0 -0
  228. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Group-Membership.md +0 -0
  229. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Keep-Notes.md +0 -0
  230. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Looker-Studio.md +0 -0
  231. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Meet.md +0 -0
  232. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-People-Contacts-Profiles.md +0 -0
  233. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Photo.md +0 -0
  234. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Profile-Photo.md +0 -0
  235. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Profile-Sharing.md +0 -0
  236. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Shared-Drives.md +0 -0
  237. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  238. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Spreadsheets.md +0 -0
  239. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Tag-Manager.md +0 -0
  240. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Tasks.md +0 -0
  241. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Tokens.md +0 -0
  242. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  243. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users-YouTube.md +0 -0
  244. {gam7-7.24.1 → gam7-7.25.0}/wiki/Users.md +0 -0
  245. {gam7-7.24.1 → gam7-7.25.0}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  246. {gam7-7.24.1 → gam7-7.25.0}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  247. {gam7-7.24.1 → gam7-7.25.0}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  248. {gam7-7.24.1 → gam7-7.25.0}/wiki/Vault-Takeout.md +0 -0
  249. {gam7-7.24.1 → gam7-7.25.0}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  250. {gam7-7.24.1 → gam7-7.25.0}/wiki/_Sidebar.md +0 -0
  251. {gam7-7.24.1 → gam7-7.25.0}/wiki/gam.cfg.md +0 -0
  252. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Android-Installation.md +0 -0
  254. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-BulkOperations.md +0 -0
  255. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-CalendarExamples.md +0 -0
  256. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Chat-Bot.md +0 -0
  257. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Custom-Schemas.md +0 -0
  273. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Data-Transfers.md +0 -0
  274. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-DomainVerification.md +0 -0
  275. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-ExamplesCSV.md +0 -0
  277. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM-options-files.md +0 -0
  282. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Home.md +0 -0
  290. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-LicenseExamples.md +0 -0
  293. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Managing-Admins.md +0 -0
  294. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Managing-Devices.md +0 -0
  296. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Printers.md +0 -0
  299. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-ResellerCommands.md +0 -0
  300. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-SecurityExamples.md +0 -0
  301. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.24.1 → gam7-7.25.0}/wiki/legacy/l-_Footer.md +0 -0
@@ -158,7 +158,7 @@ jobs:
158
158
  with:
159
159
  path: |
160
160
  cache.tar.xz
161
- key: gam-${{ matrix.jid }}-20251002
161
+ key: gam-${{ matrix.jid }}-20251007
162
162
 
163
163
  - name: Untar Cache archive
164
164
  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.24.1
3
+ Version: 7.25.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,24 @@
1
+ 7.25.00
2
+
3
+ Removed a capabilty added in 7.24.00 that allowed reading command data from Google Docs and Sheets
4
+ when a user's service account access to Drive and Sheets had been disabled. Jay was concerned
5
+ that this change could be exploited to give access to all user's files.
6
+
7
+ This capability has been replaced by issuing the following commands. The admin specified in `gam oauth create`
8
+ can read command data from Docs and Sheets to which it has access.
9
+ ```
10
+ gam config commanddata_clientaccess true save
11
+ gam oauth create
12
+ Enable the following and proceed to authorization.
13
+
14
+ [*] 42) Drive API - commanddata_clientaccess
15
+ [*] 54) Sheets API - commanddata_clientaccess
16
+ ```
17
+
18
+ Fixed in bug in `gam report` that caused a trap with either of the `thismonth` or `previousmonths` options were used.
19
+
20
+ Upgraded to Python 3.14.0.
21
+
1
22
  7.24.01
2
23
 
3
24
  Updated GAM to handle the following error that occurs when GAM tries to authenticate
@@ -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.24.01'
28
+ __version__ = '7.25.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
@@ -2113,12 +2113,12 @@ class StartEndTime():
2113
2113
  else:
2114
2114
  firstMonth = getInteger(minVal=1, maxVal=6)
2115
2115
  currDate = todaysDate()
2116
- self.startDateTime = currDate.shift(months=-firstMonth, day=1, hour=0, minute=0, second=0, microsecond=0)
2116
+ self.startDateTime = currDate.replace(day=1, hour=0, minute=0, second=0, microsecond=0).shift(months=-firstMonth)
2117
2117
  self.startTime = ISOformatTimeStamp(self.startDateTime)
2118
2118
  if myarg == 'thismonth':
2119
2119
  self.endDateTime = todaysTime()
2120
2120
  else:
2121
- self.endDateTime = currDate.shift(day=1, hour=23, minute=59, second=59, microsecond=0).shift(days=-1)
2121
+ self.endDateTime = currDate.replace(day=1, hour=23, minute=59, second=59, microsecond=0).shift(days=-1)
2122
2122
  self.endTime = ISOformatTimeStamp(self.endDateTime)
2123
2123
  if self.startDateTime and self.endDateTime and self.endDateTime < self.startDateTime:
2124
2124
  Cmd.Backup()
@@ -3049,7 +3049,10 @@ def getGDocData(gformat):
3049
3049
  mimeType = GDOC_FORMAT_MIME_TYPES[gformat]
3050
3050
  user = getEmailAddress()
3051
3051
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3052
- _, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3052
+ if not GC.Values[GC.COMMANDDATA_CLIENTACCESS]:
3053
+ _, drive = buildGAPIServiceObject(API.DRIVE3, user)
3054
+ else:
3055
+ drive = buildGAPIObject(API.DRIVE3)
3053
3056
  if not drive:
3054
3057
  sys.exit(GM.Globals[GM.SYSEXITRC])
3055
3058
  _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
@@ -3106,7 +3109,10 @@ def getGSheetData():
3106
3109
  user = getEmailAddress()
3107
3110
  fileIdEntity = getDriveFileEntity(queryShortcutsOK=False)
3108
3111
  sheetEntity = getSheetEntity(False)
3109
- user, drive = buildGAPIServiceObject(chooseSaAPI(API.DRIVECD, API.DRIVE3), user)
3112
+ if not GC.Values[GC.COMMANDDATA_CLIENTACCESS]:
3113
+ user, drive = buildGAPIServiceObject(API.DRIVE3, user)
3114
+ else:
3115
+ drive = buildGAPIObject(API.DRIVE3)
3110
3116
  if not drive:
3111
3117
  sys.exit(GM.Globals[GM.SYSEXITRC])
3112
3118
  _, _, jcount = _validateUserGetFileIDs(user, 0, 0, fileIdEntity, drive=drive)
@@ -3114,7 +3120,10 @@ def getGSheetData():
3114
3120
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.NO_ENTITIES_FOUND.format(Ent.Singular(Ent.DRIVE_FILE)))
3115
3121
  if jcount > 1:
3116
3122
  getGDocSheetDataFailedExit([Ent.USER, user], Msg.MULTIPLE_ENTITIES_FOUND.format(Ent.Plural(Ent.DRIVE_FILE), jcount, ','.join(fileIdEntity['list'])))
3117
- _, sheet = buildGAPIServiceObject(chooseSaAPI(API.SHEETSCD, API.SHEETS), user)
3123
+ if not GC.Values[GC.COMMANDDATA_CLIENTACCESS]:
3124
+ _, sheet = buildGAPIServiceObject(API.SHEETS, user)
3125
+ else:
3126
+ sheet = buildGAPIObject(API.SHEETS)
3118
3127
  if not sheet:
3119
3128
  sys.exit(GM.Globals[GM.SYSEXITRC])
3120
3129
  fileId = fileIdEntity['list'][0]
@@ -9596,7 +9605,7 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo
9596
9605
  clearRowFilters = False
9597
9606
  # if sys.platform.startswith('win'):
9598
9607
  # signal.signal(signal.SIGINT, signal.SIG_IGN)
9599
- if multiprocessing.get_start_method() == 'spawn':
9608
+ if multiprocessing.get_start_method() != 'fork':
9600
9609
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9601
9610
  Cmd = glclargs.GamCLArgs()
9602
9611
  else:
@@ -9638,7 +9647,7 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo
9638
9647
  Cmd.InitializeArguments(dataItem)
9639
9648
  elif dataType == GM.REDIRECT_QUEUE_GLOBALS:
9640
9649
  GM.Globals = dataItem
9641
- if multiprocessing.get_start_method() == 'spawn':
9650
+ if multiprocessing.get_start_method() != 'fork':
9642
9651
  reopenSTDFile(GM.STDOUT)
9643
9652
  reopenSTDFile(GM.STDERR)
9644
9653
  elif dataType == GM.REDIRECT_QUEUE_VALUES:
@@ -9684,7 +9693,7 @@ def initializeCSVFileQueueHandler(mpManager, mpQueueStdout, mpQueueStderr):
9684
9693
  def terminateCSVFileQueueHandler(mpQueue, mpQueueHandler):
9685
9694
  GM.Globals[GM.PARSER] = None
9686
9695
  GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE] = None
9687
- if multiprocessing.get_start_method() == 'spawn':
9696
+ if multiprocessing.get_start_method() != 'fork':
9688
9697
  mpQueue.put((GM.REDIRECT_QUEUE_ARGS, Cmd.AllArguments()))
9689
9698
  savedValues = saveNonPickleableValues()
9690
9699
  mpQueue.put((GM.REDIRECT_QUEUE_GLOBALS, GM.Globals))
@@ -9714,13 +9723,13 @@ def StdQueueHandler(mpQueue, stdtype, gmGlobals, gcValues):
9714
9723
 
9715
9724
  # if sys.platform.startswith('win'):
9716
9725
  # signal.signal(signal.SIGINT, signal.SIG_IGN)
9717
- if multiprocessing.get_start_method() == 'spawn':
9726
+ if multiprocessing.get_start_method() != 'fork':
9718
9727
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9719
9728
  GM.Globals = gmGlobals.copy()
9720
9729
  GC.Values = gcValues.copy()
9721
9730
  pid0DataItem = [KEYBOARD_INTERRUPT_RC, None]
9722
9731
  pidData = {}
9723
- if multiprocessing.get_start_method() == 'spawn':
9732
+ if multiprocessing.get_start_method() != 'fork':
9724
9733
  if GM.Globals[stdtype][GM.REDIRECT_NAME] == 'null':
9725
9734
  fd = open(os.devnull, GM.Globals[stdtype][GM.REDIRECT_MODE], encoding=UTF8)
9726
9735
  elif GM.Globals[stdtype][GM.REDIRECT_NAME] == '-':
@@ -9808,7 +9817,7 @@ def ProcessGAMCommandMulti(pid, numItems, logCmd, mpQueueCSVFile, mpQueueStdout,
9808
9817
  with mplock:
9809
9818
  initializeLogging()
9810
9819
  # if sys.platform.startswith('win'):
9811
- if multiprocessing.get_start_method() == 'spawn':
9820
+ if multiprocessing.get_start_method() != 'fork':
9812
9821
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9813
9822
  GM.Globals[GM.API_CALLS_RETRY_DATA] = {}
9814
9823
  GM.Globals[GM.CMDLOG_LOGGER] = None
@@ -9949,7 +9958,7 @@ def MultiprocessGAMCommands(items, showCmds):
9949
9958
  mpManager = multiprocessing.Manager()
9950
9959
  l = mpManager.Lock()
9951
9960
  try:
9952
- if multiprocessing.get_start_method() == 'spawn':
9961
+ if multiprocessing.get_start_method() != 'fork':
9953
9962
  pool = mpManager.Pool(processes=numPoolProcesses, initializer=initGamWorker, initargs=(l,), maxtasksperchild=200)
9954
9963
  else:
9955
9964
  pool = multiprocessing.Pool(processes=numPoolProcesses, initializer=initGamWorker, initargs=(l,), maxtasksperchild=200)
@@ -9958,7 +9967,7 @@ def MultiprocessGAMCommands(items, showCmds):
9958
9967
  except AssertionError as e:
9959
9968
  Cmd.SetLocation(0)
9960
9969
  usageErrorExit(str(e))
9961
- if multiprocessing.get_start_method() == 'spawn':
9970
+ if multiprocessing.get_start_method() != 'fork':
9962
9971
  savedValues = saveNonPickleableValues()
9963
9972
  if GM.Globals[GM.STDOUT][GM.REDIRECT_MULTIPROCESS]:
9964
9973
  mpQueueStdout, mpQueueHandlerStdout = initializeStdQueueHandler(mpManager, GM.STDOUT, GM.Globals, GC.Values)
@@ -9973,7 +9982,7 @@ def MultiprocessGAMCommands(items, showCmds):
9973
9982
  mpQueueStderr = mpQueueStdout
9974
9983
  else:
9975
9984
  mpQueueStderr = None
9976
- if multiprocessing.get_start_method() == 'spawn':
9985
+ if multiprocessing.get_start_method() != 'fork':
9977
9986
  restoreNonPickleableValues(savedValues)
9978
9987
  if mpQueueStdout:
9979
9988
  mpQueueStdout.put((0, GM.REDIRECT_QUEUE_DATA, GM.Globals[GM.STDOUT][GM.REDIRECT_MULTI_FD].getvalue()))
@@ -11137,7 +11146,7 @@ class Credentials(google.oauth2.credentials.Credentials):
11137
11146
 
11138
11147
  def doOAuthRequest(currentScopes, login_hint, verifyScopes=False):
11139
11148
  client_id, client_secret = getOAuthClientIDAndSecret()
11140
- scopesList = API.getClientScopesList(GC.Values[GC.TODRIVE_CLIENTACCESS])
11149
+ scopesList = API.getClientScopesList(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11141
11150
  if not currentScopes or verifyScopes:
11142
11151
  selectedScopes = getScopesFromUser(scopesList, True, currentScopes)
11143
11152
  if selectedScopes is None:
@@ -11183,7 +11192,7 @@ def doOAuthCreate():
11183
11192
  else:
11184
11193
  login_hint = None
11185
11194
  scopes = []
11186
- scopesList = API.getClientScopesList(GC.Values[GC.TODRIVE_CLIENTACCESS])
11195
+ scopesList = API.getClientScopesList(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11187
11196
  while Cmd.ArgumentsRemaining():
11188
11197
  myarg = getArgument()
11189
11198
  if myarg == 'admin':
@@ -11199,7 +11208,9 @@ def doOAuthCreate():
11199
11208
  scopes.append(uscope)
11200
11209
  break
11201
11210
  else:
11202
- invalidChoiceExit(uscope, API.getClientScopesURLs(GC.Values[GC.TODRIVE_CLIENTACCESS]), True)
11211
+ invalidChoiceExit(uscope,
11212
+ API.getClientScopesURLs(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS]),
11213
+ True)
11203
11214
  else:
11204
11215
  unknownArgumentExit()
11205
11216
  if len(scopes) == 0:
@@ -11310,7 +11321,7 @@ def doOAuthUpdate():
11310
11321
  if 'scopes' in jsonDict:
11311
11322
  currentScopes = jsonDict['scopes']
11312
11323
  else:
11313
- currentScopes = API.getClientScopesURLs(GC.Values[GC.TODRIVE_CLIENTACCESS])
11324
+ currentScopes = API.getClientScopesURLs(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11314
11325
  else:
11315
11326
  currentScopes = []
11316
11327
  except (AttributeError, IndexError, KeyError, SyntaxError, TypeError, ValueError) as e:
@@ -34,7 +34,12 @@ def main():
34
34
 
35
35
  # Run from command line
36
36
  if __name__ == '__main__':
37
- if platform.system() != 'Linux':
37
+ if getattr(sys, 'frozen', False): # we're frozen:
38
38
  multiprocessing.freeze_support()
39
+ if platform.system() == 'Linux':
40
+ # set explictly since it's not default in Python < 3.14, forkserver should
41
+ # be safer than fork and less likely to see bulk command hangs.
42
+ multiprocessing.set_start_method('forkserver')
43
+ else:
39
44
  multiprocessing.set_start_method('spawn')
40
45
  main()
@@ -60,7 +60,6 @@ DIRECTORY = 'directory'
60
60
  DOCS = 'docs'
61
61
  DRIVE2 = 'drive2'
62
62
  DRIVE3 = 'drive3'
63
- DRIVECD = 'drivecd'
64
63
  DRIVETD = 'drivetd'
65
64
  DRIVEACTIVITY = 'driveactivity'
66
65
  DRIVELABELS = 'drivelabels'
@@ -92,7 +91,6 @@ SERVICEACCOUNTLOOKUP = 'serviceaccountlookup'
92
91
  SERVICEMANAGEMENT = 'servicemanagement'
93
92
  SERVICEUSAGE = 'serviceusage'
94
93
  SHEETS = 'sheets'
95
- SHEETSCD = 'sheetscd'
96
94
  SHEETSTD = 'sheetstd'
97
95
  SITEVERIFICATION = 'siteVerification'
98
96
  STORAGE = 'storage'
@@ -107,6 +105,8 @@ YOUTUBE = 'youtube'
107
105
  BUSINESSACCOUNTMANAGEMENT_SCOPE = 'https://www.googleapis.com/auth/business.manage'
108
106
  CHROMEVERSIONHISTORY_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms'
109
107
  DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive'
108
+ DRIVE_FILE_SCOPE = 'https://www.googleapis.com/auth/drive.file'
109
+ DRIVE_READONLY_SCOPE = 'https://www.googleapis.com/auth/drive.readonly'
110
110
  GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'
111
111
  GOOGLE_AUTH_PROVIDER_X509_CERT_URL = 'https://www.googleapis.com/oauth2/v1/certs'
112
112
  GOOGLE_OAUTH2_ENDPOINT = 'https://accounts.google.com/o/oauth2/v2/auth'
@@ -256,7 +256,6 @@ _INFO = {
256
256
  DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
257
257
  DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
258
258
  DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
259
- DRIVECD: {'name': 'Drive API v3 - read command data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
260
259
  DRIVETD: {'name': 'Drive API v3 - write todrive data', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
261
260
  DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
262
261
  DRIVELABELS_ADMIN: {'name': 'Drive Labels API - Admin', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
@@ -287,7 +286,6 @@ _INFO = {
287
286
  SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
288
287
  SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
289
288
  SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
290
- SHEETSCD: {'name': 'Sheets API - read command data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
291
289
  SHEETSTD: {'name': 'Sheets API - write todrive data', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
292
290
  SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
293
291
  STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
@@ -535,6 +533,17 @@ _CLIENT_SCOPES = [
535
533
  'scope': 'https://www.googleapis.com/auth/ediscovery'},
536
534
  ]
537
535
 
536
+ _COMMANDDATA_CLIENT_SCOPES = [
537
+ {'name': 'Drive API - commanddata_clientaccess',
538
+ 'api': DRIVE3,
539
+ 'subscopes': [],
540
+ 'scope': DRIVE_READONLY_SCOPE},
541
+ {'name': 'Sheets API - commanddata_clientaccess',
542
+ 'api': SHEETS,
543
+ 'subscopes': [],
544
+ 'scope': 'https://www.googleapis.com/auth/spreadsheets.readonly'},
545
+ ]
546
+
538
547
  _TODRIVE_CLIENT_SCOPES = [
539
548
  {'name': 'Drive API - todrive_clientaccess',
540
549
  'api': DRIVE3,
@@ -543,7 +552,7 @@ _TODRIVE_CLIENT_SCOPES = [
543
552
  {'name': 'Drive File API - todrive_clientaccess',
544
553
  'api': DRIVE3,
545
554
  'subscopes': [],
546
- 'scope': 'https://www.googleapis.com/auth/drive.file'},
555
+ 'scope': DRIVE_FILE_SCOPE},
547
556
  {'name': 'Gmail API - todrive_clientaccess',
548
557
  'api': GMAIL,
549
558
  'subscopes': [],
@@ -648,7 +657,8 @@ _SVCACCT_SCOPES = [
648
657
  {'name': 'Drive Activity API v2 - must pair with Drive API',
649
658
  'api': DRIVEACTIVITY,
650
659
  'subscopes': [],
651
- 'scope': 'https://www.googleapis.com/auth/drive.activity'},
660
+ 'scope': [DRIVE_READONLY_SCOPE,
661
+ 'https://www.googleapis.com/auth/drive.activity']},
652
662
  {'name': 'Drive Labels API - Admin',
653
663
  'api': DRIVELABELS_ADMIN,
654
664
  'subscopes': READONLY,
@@ -661,10 +671,12 @@ _SVCACCT_SCOPES = [
661
671
  'api': DOCS,
662
672
  'subscopes': READONLY,
663
673
  'scope': 'https://www.googleapis.com/auth/documents'},
664
- {'name': 'Forms API',
674
+ {'name': 'Forms API - must pair with Drive API',
665
675
  'api': FORMS,
666
676
  'subscopes': [],
667
- 'scope': DRIVE_SCOPE},
677
+ 'scope': [DRIVE_READONLY_SCOPE,
678
+ 'https://www.googleapis.com/auth/forms.body',
679
+ 'https://www.googleapis.com/auth/forms.responses.readonly']},
668
680
  {'name': 'Gmail API - Full Access (Labels, Messages)',
669
681
  'api': GMAIL,
670
682
  'subscopes': [],
@@ -755,12 +767,7 @@ _SVCACCT_SCOPES = [
755
767
  ]
756
768
 
757
769
  _SVCACCT_SPECIAL_SCOPES = [
758
- {'name': 'Drive API - read command data',
759
- 'api': DRIVECD,
760
- 'subscopes': [],
761
- 'offByDefault': True,
762
- 'scope': DRIVE_SCOPE+'.readonly'},
763
- {'name': 'Drive API - write todrive data',
770
+ {'name': 'Drive API - write todrive data - has access to all Drive',
764
771
  'api': DRIVETD,
765
772
  'subscopes': [],
766
773
  'offByDefault': True,
@@ -775,12 +782,7 @@ _SVCACCT_SPECIAL_SCOPES = [
775
782
  'subscopes': [],
776
783
  'offByDefault': True,
777
784
  'scope': GMAIL_SEND_SCOPE},
778
- {'name': 'Sheets API - read command data',
779
- 'api': SHEETSCD,
780
- 'offByDefault': True,
781
- 'subscopes': [],
782
- 'scope': 'https://www.googleapis.com/auth/spreadsheets.readonly'},
783
- {'name': 'Sheets API - write todrive data',
785
+ {'name': 'Sheets API - write todrive data - has access to all Sheets',
784
786
  'api': SHEETSTD,
785
787
  'offByDefault': True,
786
788
  'subscopes': [],
@@ -806,14 +808,18 @@ def getVersion(api):
806
808
  def getClientScopesSet(api):
807
809
  return {scope['scope'] for scope in _CLIENT_SCOPES if scope['api'] == api}
808
810
 
809
- def getClientScopesList(todriveClientAccess):
811
+ def getClientScopesList(commanddataClientAccess, todriveClientAccess):
810
812
  caScopes = _CLIENT_SCOPES[:]
813
+ if commanddataClientAccess:
814
+ caScopes.extend(_COMMANDDATA_CLIENT_SCOPES)
811
815
  if todriveClientAccess:
812
816
  caScopes.extend(_TODRIVE_CLIENT_SCOPES)
813
817
  return sorted(caScopes, key=lambda k: k['name'])
814
818
 
815
- def getClientScopesURLs(todriveClientAccess):
819
+ def getClientScopesURLs(commanddataClientAccess, todriveClientAccess):
816
820
  caScopes = _CLIENT_SCOPES[:]
821
+ if commanddataClientAccess:
822
+ caScopes.extend(_COMMANDDATA_CLIENT_SCOPES)
817
823
  if todriveClientAccess:
818
824
  caScopes.extend(_TODRIVE_CLIENT_SCOPES)
819
825
  return sorted({scope['scope'] for scope in _CLIENT_SCOPES})
@@ -85,6 +85,8 @@ CMDLOG_MAX__BACKUPS = 'cmdlog_max__backups'
85
85
  CMDLOG_MAX_BACKUPS = 'cmdlog_max_backups'
86
86
  # Command logging max kilo bytes per log file
87
87
  CMDLOG_MAX_KILO_BYTES = 'cmdlog_max_kilo_bytes'
88
+ # Use client access for command data from Google Docs/Sheets
89
+ COMMANDDATA_CLIENTACCESS = 'commanddata_clientaccess'
88
90
  # GAM config directory containing client_secrets.json, oauth2.txt, oauth2service.json, extra_args.txt
89
91
  CONFIG_DIR = 'config_dir'
90
92
  # When retrieving lists of Google Contacts from API, how many should be retrieved in each chunk
@@ -344,6 +346,7 @@ Defaults = {
344
346
  CMDLOG: '',
345
347
  CMDLOG_MAX_BACKUPS: 5,
346
348
  CMDLOG_MAX_KILO_BYTES: 1000,
349
+ COMMANDDATA_CLIENTACCESS: FALSE,
347
350
  CONFIG_DIR: '',
348
351
  CONTACT_MAX_RESULTS: '100',
349
352
  CSV_INPUT_COLUMN_DELIMITER: ',',
@@ -512,6 +515,7 @@ VAR_INFO = {
512
515
  CMDLOG: {VAR_TYPE: TYPE_FILE, VAR_ACCESS: os.W_OK},
513
516
  CMDLOG_MAX_BACKUPS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10)},
514
517
  CMDLOG_MAX_KILO_BYTES: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (100, 10000)},
518
+ COMMANDDATA_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
515
519
  CONFIG_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMUSERCONFIGDIR'},
516
520
  CONTACT_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10000)},
517
521
  CSV_INPUT_COLUMN_DELIMITER: {VAR_TYPE: TYPE_CHARACTER},
@@ -10,6 +10,14 @@ 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.24.01
14
+
15
+ Updated GAM to handle the following error that occurs when GAM tries to authenticate
16
+ as a user that has been disabled by Google.
17
+ ```
18
+ ERROR: Authentication Token Error - invalid_account: Forbidden
19
+ ```
20
+
13
21
  ### 7.24.00
14
22
 
15
23
  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,
@@ -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.24.00 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.24.01 - 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.24.00 - https://github.com/GAM-team/GAM - pythonsource
993
+ GAM 7.24.01 - 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
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.24.00 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.24.01 - 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.24.00 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.24.01 - 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.24.00 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.24.01 - 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
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