gam7 7.24.1__tar.gz → 7.25.1__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.1}/.github/workflows/build.yml +1 -1
  2. {gam7-7.24.1 → gam7-7.25.1}/PKG-INFO +1 -1
  3. {gam7-7.24.1 → gam7-7.25.1}/src/GamUpdate.txt +26 -0
  4. {gam7-7.24.1 → gam7-7.25.1}/src/gam/__init__.py +33 -25
  5. {gam7-7.24.1 → gam7-7.25.1}/src/gam/__main__.py +6 -1
  6. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glapi.py +28 -22
  7. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glcfg.py +4 -0
  8. {gam7-7.24.1 → gam7-7.25.1}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +12 -6
  9. {gam7-7.24.1 → gam7-7.25.1}/wiki/GamUpdates.md +31 -0
  10. {gam7-7.24.1 → gam7-7.25.1}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +4 -4
  11. {gam7-7.24.1 → gam7-7.25.1}/wiki/Todrive.md +2 -2
  12. {gam7-7.24.1 → gam7-7.25.1}/wiki/Version-and-Help.md +10 -10
  13. {gam7-7.24.1 → gam7-7.25.1}/wiki/gam.cfg.md +5 -0
  14. {gam7-7.24.1 → gam7-7.25.1}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  15. {gam7-7.24.1 → gam7-7.25.1}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  16. {gam7-7.24.1 → gam7-7.25.1}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  17. {gam7-7.24.1 → gam7-7.25.1}/.github/ISSUE_TEMPLATE.txt +0 -0
  18. {gam7-7.24.1 → gam7-7.25.1}/.github/actions/decrypt.sh +0 -0
  19. {gam7-7.24.1 → gam7-7.25.1}/.github/actions/entitlements.plist +0 -0
  20. {gam7-7.24.1 → gam7-7.25.1}/.github/actions/package_exclusions.txt +0 -0
  21. {gam7-7.24.1 → gam7-7.25.1}/.github/stale.yml +0 -0
  22. {gam7-7.24.1 → gam7-7.25.1}/.github/workflows/codeql-analysis.yml +0 -0
  23. {gam7-7.24.1 → gam7-7.25.1}/.github/workflows/get-cacerts.yml +0 -0
  24. {gam7-7.24.1 → gam7-7.25.1}/.github/workflows/pushwiki.yml +0 -0
  25. {gam7-7.24.1 → gam7-7.25.1}/.github/workflows/pypi.yml +0 -0
  26. {gam7-7.24.1 → gam7-7.25.1}/LICENSE +0 -0
  27. {gam7-7.24.1 → gam7-7.25.1}/README.md +0 -0
  28. {gam7-7.24.1 → gam7-7.25.1}/pyproject.toml +0 -0
  29. {gam7-7.24.1 → gam7-7.25.1}/src/.gitignore +0 -0
  30. {gam7-7.24.1 → gam7-7.25.1}/src/GamCommands.txt +0 -0
  31. {gam7-7.24.1 → gam7-7.25.1}/src/LICENSE +0 -0
  32. {gam7-7.24.1 → gam7-7.25.1}/src/README.md +0 -0
  33. {gam7-7.24.1 → gam7-7.25.1}/src/callgam.py +0 -0
  34. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/client.py +0 -0
  37. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/core.py +0 -0
  38. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/data.py +0 -0
  39. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/http.py +0 -0
  40. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/service.py +0 -0
  46. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.24.1 → gam7-7.25.1}/src/gam/atom/url.py +0 -0
  48. {gam7-7.24.1 → gam7-7.25.1}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.24.1 → gam7-7.25.1}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.24.1 → gam7-7.25.1}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.24.1 → gam7-7.25.1}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glclargs.py +0 -0
  55. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glentity.py +0 -0
  56. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glgapi.py +0 -0
  57. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glgdata.py +0 -0
  58. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glglobals.py +0 -0
  59. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glindent.py +0 -0
  60. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glmsgs.py +0 -0
  61. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glskus.py +0 -0
  62. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/gluprop.py +0 -0
  63. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/glverlibs.py +0 -0
  64. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gamlib/yubikey.py +0 -0
  65. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/__init__.py +0 -0
  66. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/alt/__init__.py +0 -0
  67. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/alt/app_engine.py +0 -0
  68. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/alt/appengine.py +0 -0
  69. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/__init__.py +0 -0
  70. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/audit/__init__.py +0 -0
  71. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/audit/service.py +0 -0
  72. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  73. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/contacts/service.py +0 -0
  74. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/apps/service.py +0 -0
  75. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/service.py +0 -0
  76. {gam7-7.24.1 → gam7-7.25.1}/src/gam/gdata/urlfetch.py +0 -0
  77. {gam7-7.24.1 → gam7-7.25.1}/src/gam/meet-v2beta.json +0 -0
  78. {gam7-7.24.1 → gam7-7.25.1}/src/gam/serviceaccountlookup-v1.json +0 -0
  79. {gam7-7.24.1 → gam7-7.25.1}/src/gam-install.sh +0 -0
  80. {gam7-7.24.1 → gam7-7.25.1}/src/gam-setup.bat +0 -0
  81. {gam7-7.24.1 → gam7-7.25.1}/src/gam.exe.manifest +0 -0
  82. {gam7-7.24.1 → gam7-7.25.1}/src/gam.py +0 -0
  83. {gam7-7.24.1 → gam7-7.25.1}/src/gam.spec +0 -0
  84. {gam7-7.24.1 → gam7-7.25.1}/src/gam.wxs +0 -0
  85. {gam7-7.24.1 → gam7-7.25.1}/src/license.rtf +0 -0
  86. {gam7-7.24.1 → gam7-7.25.1}/src/tools/a_atleast_b.py +0 -0
  87. {gam7-7.24.1 → gam7-7.25.1}/src/tools/gen-wix-xml-filelist.py +0 -0
  88. {gam7-7.24.1 → gam7-7.25.1}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  89. {gam7-7.24.1 → gam7-7.25.1}/src/tools/hooks/hook-httplib2.py +0 -0
  90. {gam7-7.24.1 → gam7-7.25.1}/src/tools/mkGamRef.py +0 -0
  91. {gam7-7.24.1 → gam7-7.25.1}/src/tools/openssl.props +0 -0
  92. {gam7-7.24.1 → gam7-7.25.1}/src/tools/ssd.mjs +0 -0
  93. {gam7-7.24.1 → gam7-7.25.1}/src/version_info.txt.in +0 -0
  94. {gam7-7.24.1 → gam7-7.25.1}/wiki/00scratch.md +0 -0
  95. {gam7-7.24.1 → gam7-7.25.1}/wiki/Addresses.md +0 -0
  96. {gam7-7.24.1 → gam7-7.25.1}/wiki/Administrators.md +0 -0
  97. {gam7-7.24.1 → gam7-7.25.1}/wiki/Alert-Center.md +0 -0
  98. {gam7-7.24.1 → gam7-7.25.1}/wiki/Aliases.md +0 -0
  99. {gam7-7.24.1 → gam7-7.25.1}/wiki/Authorization.md +0 -0
  100. {gam7-7.24.1 → gam7-7.25.1}/wiki/BNF-Syntax.md +0 -0
  101. {gam7-7.24.1 → gam7-7.25.1}/wiki/Basic-Items.md +0 -0
  102. {gam7-7.24.1 → gam7-7.25.1}/wiki/Bulk-Processing.md +0 -0
  103. {gam7-7.24.1 → gam7-7.25.1}/wiki/Business-Account-Management.md +0 -0
  104. {gam7-7.24.1 → gam7-7.25.1}/wiki/CSV-Input-Filtering.md +0 -0
  105. {gam7-7.24.1 → gam7-7.25.1}/wiki/CSV-Output-Filtering.md +0 -0
  106. {gam7-7.24.1 → gam7-7.25.1}/wiki/CSV-Special-Characters.md +0 -0
  107. {gam7-7.24.1 → gam7-7.25.1}/wiki/Calendars-Access.md +0 -0
  108. {gam7-7.24.1 → gam7-7.25.1}/wiki/Calendars-Events.md +0 -0
  109. {gam7-7.24.1 → gam7-7.25.1}/wiki/Calendars.md +0 -0
  110. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chat-Bot-Setup-Use.md +0 -0
  111. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-AUE-Counts.md +0 -0
  112. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  113. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Installed-Apps.md +0 -0
  114. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  115. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Policies.md +0 -0
  116. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Printers.md +0 -0
  117. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Profile-Management.md +0 -0
  118. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Version-Counts.md +0 -0
  119. {gam7-7.24.1 → gam7-7.25.1}/wiki/Chrome-Version-History.md +0 -0
  120. {gam7-7.24.1 → gam7-7.25.1}/wiki/ChromeOS-Devices.md +0 -0
  121. {gam7-7.24.1 → gam7-7.25.1}/wiki/Classroom-Courses.md +0 -0
  122. {gam7-7.24.1 → gam7-7.25.1}/wiki/Classroom-Guardians.md +0 -0
  123. {gam7-7.24.1 → gam7-7.25.1}/wiki/Classroom-Invitations.md +0 -0
  124. {gam7-7.24.1 → gam7-7.25.1}/wiki/Classroom-Membership.md +0 -0
  125. {gam7-7.24.1 → gam7-7.25.1}/wiki/Classroom-StudentGroups.md +0 -0
  126. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Channel.md +0 -0
  127. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Identity-Devices.md +0 -0
  128. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  129. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Identity-Groups.md +0 -0
  130. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Identity-Policies.md +0 -0
  131. {gam7-7.24.1 → gam7-7.25.1}/wiki/Cloud-Storage.md +0 -0
  132. {gam7-7.24.1 → gam7-7.25.1}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  133. {gam7-7.24.1 → gam7-7.25.1}/wiki/Collections-of-Items.md +0 -0
  134. {gam7-7.24.1 → gam7-7.25.1}/wiki/Collections-of-Users.md +0 -0
  135. {gam7-7.24.1 → gam7-7.25.1}/wiki/Command-Line-Parsing.md +0 -0
  136. {gam7-7.24.1 → gam7-7.25.1}/wiki/Command-Logging-Progress.md +0 -0
  137. {gam7-7.24.1 → gam7-7.25.1}/wiki/Context-Aware-Access-Levels.md +0 -0
  138. {gam7-7.24.1 → gam7-7.25.1}/wiki/Customer.md +0 -0
  139. {gam7-7.24.1 → gam7-7.25.1}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  140. {gam7-7.24.1 → gam7-7.25.1}/wiki/Domain-SharedContacts.md +0 -0
  141. {gam7-7.24.1 → gam7-7.25.1}/wiki/Domains-Verification.md +0 -0
  142. {gam7-7.24.1 → gam7-7.25.1}/wiki/Domains.md +0 -0
  143. {gam7-7.24.1 → gam7-7.25.1}/wiki/Downloads-Installs.md +0 -0
  144. {gam7-7.24.1 → gam7-7.25.1}/wiki/Drive-File-Selection.md +0 -0
  145. {gam7-7.24.1 → gam7-7.25.1}/wiki/Drive-Items.md +0 -0
  146. {gam7-7.24.1 → gam7-7.25.1}/wiki/Drive-REST-API-v3.md +0 -0
  147. {gam7-7.24.1 → gam7-7.25.1}/wiki/Email-Audit-Monitor.md +0 -0
  148. {gam7-7.24.1 → gam7-7.25.1}/wiki/Find-File-Owner.md +0 -0
  149. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM-Public-Chat-Room.md +0 -0
  150. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM-Release-Process.md +0 -0
  151. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM-Return-Codes.md +0 -0
  152. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  153. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM7-FAQ.md +0 -0
  154. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM7-on-Android-Devices.md +0 -0
  155. {gam7-7.24.1 → gam7-7.25.1}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  156. {gam7-7.24.1 → gam7-7.25.1}/wiki/Global-Address-List.md +0 -0
  157. {gam7-7.24.1 → gam7-7.25.1}/wiki/Google-Data-Transfers.md +0 -0
  158. {gam7-7.24.1 → gam7-7.25.1}/wiki/Google-Network-Addresses.md +0 -0
  159. {gam7-7.24.1 → gam7-7.25.1}/wiki/Groups-Membership.md +0 -0
  160. {gam7-7.24.1 → gam7-7.25.1}/wiki/Groups.md +0 -0
  161. {gam7-7.24.1 → gam7-7.25.1}/wiki/HTTPS-Proxy.md +0 -0
  162. {gam7-7.24.1 → gam7-7.25.1}/wiki/Home.md +0 -0
  163. {gam7-7.24.1 → gam7-7.25.1}/wiki/How-to-Install-GAM7.md +0 -0
  164. {gam7-7.24.1 → gam7-7.25.1}/wiki/How-to-Uninstall-GAM7.md +0 -0
  165. {gam7-7.24.1 → gam7-7.25.1}/wiki/How-to-Update-GAM7.md +0 -0
  166. {gam7-7.24.1 → gam7-7.25.1}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  167. {gam7-7.24.1 → gam7-7.25.1}/wiki/Inbound-SSO.md +0 -0
  168. {gam7-7.24.1 → gam7-7.25.1}/wiki/Install-GAM-as-Python-Library.md +0 -0
  169. {gam7-7.24.1 → gam7-7.25.1}/wiki/Licenses.md +0 -0
  170. {gam7-7.24.1 → gam7-7.25.1}/wiki/List-Items.md +0 -0
  171. {gam7-7.24.1 → gam7-7.25.1}/wiki/List.md +0 -0
  172. {gam7-7.24.1 → gam7-7.25.1}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  173. {gam7-7.24.1 → gam7-7.25.1}/wiki/Mobile-Devices.md +0 -0
  174. {gam7-7.24.1 → gam7-7.25.1}/wiki/Organizational-Units.md +0 -0
  175. {gam7-7.24.1 → gam7-7.25.1}/wiki/Other-Resources.md +0 -0
  176. {gam7-7.24.1 → gam7-7.25.1}/wiki/Permission-Matches.md +0 -0
  177. {gam7-7.24.1 → gam7-7.25.1}/wiki/Python-Regular-Expressions.md +0 -0
  178. {gam7-7.24.1 → gam7-7.25.1}/wiki/README.md +0 -0
  179. {gam7-7.24.1 → gam7-7.25.1}/wiki/Rclone.md +0 -0
  180. {gam7-7.24.1 → gam7-7.25.1}/wiki/Reports.md +0 -0
  181. {gam7-7.24.1 → gam7-7.25.1}/wiki/Reseller.md +0 -0
  182. {gam7-7.24.1 → gam7-7.25.1}/wiki/Resources.md +0 -0
  183. {gam7-7.24.1 → gam7-7.25.1}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  184. {gam7-7.24.1 → gam7-7.25.1}/wiki/SSL-Root-CA-Certificates.md +0 -0
  185. {gam7-7.24.1 → gam7-7.25.1}/wiki/Schemas.md +0 -0
  186. {gam7-7.24.1 → gam7-7.25.1}/wiki/Scripts.md +0 -0
  187. {gam7-7.24.1 → gam7-7.25.1}/wiki/Send-Email.md +0 -0
  188. {gam7-7.24.1 → gam7-7.25.1}/wiki/Shared-Drives.md +0 -0
  189. {gam7-7.24.1 → gam7-7.25.1}/wiki/Sites.md +0 -0
  190. {gam7-7.24.1 → gam7-7.25.1}/wiki/Tag-Replace.md +0 -0
  191. {gam7-7.24.1 → gam7-7.25.1}/wiki/Unmanaged-Accounts.md +0 -0
  192. {gam7-7.24.1 → gam7-7.25.1}/wiki/Upgrade-Benefits.md +0 -0
  193. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Analytics-Admin.md +0 -0
  194. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Application-Specific-Passwords.md +0 -0
  195. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Backup-Verification-Codes.md +0 -0
  196. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Calendars-Access.md +0 -0
  197. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Calendars-Events.md +0 -0
  198. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Calendars.md +0 -0
  199. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Chat.md +0 -0
  200. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Classification-Labels.md +0 -0
  201. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Classroom-Profile.md +0 -0
  202. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Contacts-Delegates.md +0 -0
  203. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Contacts.md +0 -0
  204. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Deprovision.md +0 -0
  205. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Activity-Settings.md +0 -0
  206. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Cleanup.md +0 -0
  207. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Comments.md +0 -0
  208. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Copy-Move.md +0 -0
  209. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Files-Display.md +0 -0
  210. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Files-Manage.md +0 -0
  211. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Orphans.md +0 -0
  212. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Ownership.md +0 -0
  213. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Permissions.md +0 -0
  214. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Query.md +0 -0
  215. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Revisions.md +0 -0
  216. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Shortcuts.md +0 -0
  217. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Drive-Transfer.md +0 -0
  218. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Forms.md +0 -0
  219. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-CSE.md +0 -0
  220. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Delegates.md +0 -0
  221. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Filters.md +0 -0
  222. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Forwarding.md +0 -0
  223. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Labels.md +0 -0
  224. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  225. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Profile.md +0 -0
  226. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-S-MIME.md +0 -0
  227. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  228. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Gmail-Settings.md +0 -0
  229. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Group-Membership.md +0 -0
  230. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Keep-Notes.md +0 -0
  231. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Looker-Studio.md +0 -0
  232. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Meet.md +0 -0
  233. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-People-Contacts-Profiles.md +0 -0
  234. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Photo.md +0 -0
  235. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Profile-Photo.md +0 -0
  236. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Profile-Sharing.md +0 -0
  237. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Shared-Drives.md +0 -0
  238. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  239. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Spreadsheets.md +0 -0
  240. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Tag-Manager.md +0 -0
  241. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Tasks.md +0 -0
  242. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Tokens.md +0 -0
  243. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  244. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users-YouTube.md +0 -0
  245. {gam7-7.24.1 → gam7-7.25.1}/wiki/Users.md +0 -0
  246. {gam7-7.24.1 → gam7-7.25.1}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  247. {gam7-7.24.1 → gam7-7.25.1}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  248. {gam7-7.24.1 → gam7-7.25.1}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  249. {gam7-7.24.1 → gam7-7.25.1}/wiki/Vault-Takeout.md +0 -0
  250. {gam7-7.24.1 → gam7-7.25.1}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  251. {gam7-7.24.1 → gam7-7.25.1}/wiki/_Sidebar.md +0 -0
  252. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Android-Installation.md +0 -0
  254. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-BulkOperations.md +0 -0
  255. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-CalendarExamples.md +0 -0
  256. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Chat-Bot.md +0 -0
  257. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Custom-Schemas.md +0 -0
  273. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Data-Transfers.md +0 -0
  274. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-DomainVerification.md +0 -0
  275. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-ExamplesCSV.md +0 -0
  277. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM-options-files.md +0 -0
  282. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Home.md +0 -0
  290. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-LicenseExamples.md +0 -0
  293. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Managing-Admins.md +0 -0
  294. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Managing-Devices.md +0 -0
  296. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Printers.md +0 -0
  299. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-ResellerCommands.md +0 -0
  300. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-SecurityExamples.md +0 -0
  301. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.24.1 → gam7-7.25.1}/wiki/legacy/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.24.1 → gam7-7.25.1}/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.1
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.25.01
2
+
3
+ Fixed bug in `gam config timezone <String>` to handle timezone abbreviations correctly;
4
+ they were incorrectly shifted to lowercase.
5
+
6
+ 7.25.00
7
+
8
+ Removed a capabilty added in 7.24.00 that allowed reading command data from Google Docs and Sheets
9
+ when a user's service account access to Drive and Sheets had been disabled. Jay was concerned
10
+ that this change could be exploited to give access to all user's files.
11
+
12
+ This capability has been replaced by issuing the following commands. The admin specified in `gam oauth create`
13
+ can read command data from Docs and Sheets to which it has access.
14
+ ```
15
+ gam config commanddata_clientaccess true save
16
+ gam oauth create
17
+ Enable the following and proceed to authorization.
18
+
19
+ [*] 42) Drive API - commanddata_clientaccess
20
+ [*] 54) Sheets API - commanddata_clientaccess
21
+ ```
22
+
23
+ Fixed in bug in `gam report` that caused a trap with either of the `thismonth` or `previousmonths` options were used.
24
+
25
+ Upgraded to Python 3.14.0.
26
+
1
27
  7.24.01
2
28
 
3
29
  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.01'
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]
@@ -3707,12 +3716,12 @@ def SetGlobalVariables():
3707
3716
  return stringlist
3708
3717
 
3709
3718
  def _getCfgTimezone(sectionName, itemName):
3710
- value = _stripStringQuotes(GM.Globals[GM.PARSER].get(sectionName, itemName).lower())
3711
- if value in {'utc', 'z'}:
3719
+ value = _stripStringQuotes(GM.Globals[GM.PARSER].get(sectionName, itemName))
3720
+ if value.lower() in {'utc', 'z'}:
3712
3721
  GM.Globals[GM.CONVERT_TO_LOCAL_TIME] = False
3713
3722
  return arrow.now('utc').tzinfo
3714
3723
  GM.Globals[GM.CONVERT_TO_LOCAL_TIME] = True
3715
- if value == 'local':
3724
+ if value.lower() == 'local':
3716
3725
  return arrow.now(value).tzinfo
3717
3726
  try:
3718
3727
  return arrow.now(value).tzinfo
@@ -4801,7 +4810,6 @@ def defaultSvcAcctScopes():
4801
4810
  saScopes[scope['api']].append(scope['scope'])
4802
4811
  else:
4803
4812
  saScopes[scope['api']].extend(scope['scope'])
4804
- saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
4805
4813
  saScopes[API.DRIVE2] = saScopes[API.DRIVE3]
4806
4814
  return saScopes
4807
4815
 
@@ -9596,7 +9604,7 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo
9596
9604
  clearRowFilters = False
9597
9605
  # if sys.platform.startswith('win'):
9598
9606
  # signal.signal(signal.SIGINT, signal.SIG_IGN)
9599
- if multiprocessing.get_start_method() == 'spawn':
9607
+ if multiprocessing.get_start_method() != 'fork':
9600
9608
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9601
9609
  Cmd = glclargs.GamCLArgs()
9602
9610
  else:
@@ -9638,7 +9646,7 @@ def CSVFileQueueHandler(mpQueue, mpQueueStdout, mpQueueStderr, csvPF, datetimeNo
9638
9646
  Cmd.InitializeArguments(dataItem)
9639
9647
  elif dataType == GM.REDIRECT_QUEUE_GLOBALS:
9640
9648
  GM.Globals = dataItem
9641
- if multiprocessing.get_start_method() == 'spawn':
9649
+ if multiprocessing.get_start_method() != 'fork':
9642
9650
  reopenSTDFile(GM.STDOUT)
9643
9651
  reopenSTDFile(GM.STDERR)
9644
9652
  elif dataType == GM.REDIRECT_QUEUE_VALUES:
@@ -9684,7 +9692,7 @@ def initializeCSVFileQueueHandler(mpManager, mpQueueStdout, mpQueueStderr):
9684
9692
  def terminateCSVFileQueueHandler(mpQueue, mpQueueHandler):
9685
9693
  GM.Globals[GM.PARSER] = None
9686
9694
  GM.Globals[GM.CSVFILE][GM.REDIRECT_QUEUE] = None
9687
- if multiprocessing.get_start_method() == 'spawn':
9695
+ if multiprocessing.get_start_method() != 'fork':
9688
9696
  mpQueue.put((GM.REDIRECT_QUEUE_ARGS, Cmd.AllArguments()))
9689
9697
  savedValues = saveNonPickleableValues()
9690
9698
  mpQueue.put((GM.REDIRECT_QUEUE_GLOBALS, GM.Globals))
@@ -9714,13 +9722,13 @@ def StdQueueHandler(mpQueue, stdtype, gmGlobals, gcValues):
9714
9722
 
9715
9723
  # if sys.platform.startswith('win'):
9716
9724
  # signal.signal(signal.SIGINT, signal.SIG_IGN)
9717
- if multiprocessing.get_start_method() == 'spawn':
9725
+ if multiprocessing.get_start_method() != 'fork':
9718
9726
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9719
9727
  GM.Globals = gmGlobals.copy()
9720
9728
  GC.Values = gcValues.copy()
9721
9729
  pid0DataItem = [KEYBOARD_INTERRUPT_RC, None]
9722
9730
  pidData = {}
9723
- if multiprocessing.get_start_method() == 'spawn':
9731
+ if multiprocessing.get_start_method() != 'fork':
9724
9732
  if GM.Globals[stdtype][GM.REDIRECT_NAME] == 'null':
9725
9733
  fd = open(os.devnull, GM.Globals[stdtype][GM.REDIRECT_MODE], encoding=UTF8)
9726
9734
  elif GM.Globals[stdtype][GM.REDIRECT_NAME] == '-':
@@ -9808,7 +9816,7 @@ def ProcessGAMCommandMulti(pid, numItems, logCmd, mpQueueCSVFile, mpQueueStdout,
9808
9816
  with mplock:
9809
9817
  initializeLogging()
9810
9818
  # if sys.platform.startswith('win'):
9811
- if multiprocessing.get_start_method() == 'spawn':
9819
+ if multiprocessing.get_start_method() != 'fork':
9812
9820
  signal.signal(signal.SIGINT, signal.SIG_IGN)
9813
9821
  GM.Globals[GM.API_CALLS_RETRY_DATA] = {}
9814
9822
  GM.Globals[GM.CMDLOG_LOGGER] = None
@@ -9949,7 +9957,7 @@ def MultiprocessGAMCommands(items, showCmds):
9949
9957
  mpManager = multiprocessing.Manager()
9950
9958
  l = mpManager.Lock()
9951
9959
  try:
9952
- if multiprocessing.get_start_method() == 'spawn':
9960
+ if multiprocessing.get_start_method() != 'fork':
9953
9961
  pool = mpManager.Pool(processes=numPoolProcesses, initializer=initGamWorker, initargs=(l,), maxtasksperchild=200)
9954
9962
  else:
9955
9963
  pool = multiprocessing.Pool(processes=numPoolProcesses, initializer=initGamWorker, initargs=(l,), maxtasksperchild=200)
@@ -9958,7 +9966,7 @@ def MultiprocessGAMCommands(items, showCmds):
9958
9966
  except AssertionError as e:
9959
9967
  Cmd.SetLocation(0)
9960
9968
  usageErrorExit(str(e))
9961
- if multiprocessing.get_start_method() == 'spawn':
9969
+ if multiprocessing.get_start_method() != 'fork':
9962
9970
  savedValues = saveNonPickleableValues()
9963
9971
  if GM.Globals[GM.STDOUT][GM.REDIRECT_MULTIPROCESS]:
9964
9972
  mpQueueStdout, mpQueueHandlerStdout = initializeStdQueueHandler(mpManager, GM.STDOUT, GM.Globals, GC.Values)
@@ -9973,7 +9981,7 @@ def MultiprocessGAMCommands(items, showCmds):
9973
9981
  mpQueueStderr = mpQueueStdout
9974
9982
  else:
9975
9983
  mpQueueStderr = None
9976
- if multiprocessing.get_start_method() == 'spawn':
9984
+ if multiprocessing.get_start_method() != 'fork':
9977
9985
  restoreNonPickleableValues(savedValues)
9978
9986
  if mpQueueStdout:
9979
9987
  mpQueueStdout.put((0, GM.REDIRECT_QUEUE_DATA, GM.Globals[GM.STDOUT][GM.REDIRECT_MULTI_FD].getvalue()))
@@ -11137,7 +11145,7 @@ class Credentials(google.oauth2.credentials.Credentials):
11137
11145
 
11138
11146
  def doOAuthRequest(currentScopes, login_hint, verifyScopes=False):
11139
11147
  client_id, client_secret = getOAuthClientIDAndSecret()
11140
- scopesList = API.getClientScopesList(GC.Values[GC.TODRIVE_CLIENTACCESS])
11148
+ scopesList = API.getClientScopesList(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11141
11149
  if not currentScopes or verifyScopes:
11142
11150
  selectedScopes = getScopesFromUser(scopesList, True, currentScopes)
11143
11151
  if selectedScopes is None:
@@ -11183,7 +11191,7 @@ def doOAuthCreate():
11183
11191
  else:
11184
11192
  login_hint = None
11185
11193
  scopes = []
11186
- scopesList = API.getClientScopesList(GC.Values[GC.TODRIVE_CLIENTACCESS])
11194
+ scopesList = API.getClientScopesList(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11187
11195
  while Cmd.ArgumentsRemaining():
11188
11196
  myarg = getArgument()
11189
11197
  if myarg == 'admin':
@@ -11199,7 +11207,9 @@ def doOAuthCreate():
11199
11207
  scopes.append(uscope)
11200
11208
  break
11201
11209
  else:
11202
- invalidChoiceExit(uscope, API.getClientScopesURLs(GC.Values[GC.TODRIVE_CLIENTACCESS]), True)
11210
+ invalidChoiceExit(uscope,
11211
+ API.getClientScopesURLs(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS]),
11212
+ True)
11203
11213
  else:
11204
11214
  unknownArgumentExit()
11205
11215
  if len(scopes) == 0:
@@ -11310,7 +11320,7 @@ def doOAuthUpdate():
11310
11320
  if 'scopes' in jsonDict:
11311
11321
  currentScopes = jsonDict['scopes']
11312
11322
  else:
11313
- currentScopes = API.getClientScopesURLs(GC.Values[GC.TODRIVE_CLIENTACCESS])
11323
+ currentScopes = API.getClientScopesURLs(GC.Values[GC.COMMANDDATA_CLIENTACCESS], GC.Values[GC.TODRIVE_CLIENTACCESS])
11314
11324
  else:
11315
11325
  currentScopes = []
11316
11326
  except (AttributeError, IndexError, KeyError, SyntaxError, TypeError, ValueError) as e:
@@ -12340,8 +12350,6 @@ def checkServiceAccount(users):
12340
12350
  saScopes[scope['api']].append(scope['roscope'])
12341
12351
  checkScopesSet.add(scope['roscope'])
12342
12352
  i += 1
12343
- if API.DRIVEACTIVITY in saScopes and API.DRIVE3 in saScopes:
12344
- saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
12345
12353
  if API.DRIVE3 in saScopes:
12346
12354
  saScopes[API.DRIVE2] = saScopes[API.DRIVE3]
12347
12355
  GM.Globals[GM.OAUTH2SERVICE_JSON_DATA][API.OAUTH2SA_SCOPES] = saScopes
@@ -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},
@@ -83,14 +83,20 @@ gam csv gsheet you@exmaple.com <DriveFileIDEntity> "Sheet 1" gam create user fir
83
83
 
84
84
  ## Limited Service Account Access
85
85
  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,
86
- issue the following command and make these settings:
86
+ issue the following commands. The admin specified in `gam oauth create` can read command data from Docs and Sheets to which it has access.
87
87
  ```
88
- gam user user@domain.com update serviceaccount
88
+ gam config commanddata_clientaccess true save
89
+ gam oauth create
90
+ Enable the following and proceed to authorization.
89
91
 
90
- [ ] 20) Drive API (supports readonly)
91
- [*] 21) Drive API - read command data
92
- [ ] 42) Sheets API (supports readonly)
93
- [*] 43) Sheets API - read command data
92
+ [*] 42) Drive API - commanddata_clientaccess
93
+ [*] 54) Sheets API - commanddata_clientaccess
94
+ ```
95
+ In these options, the `<EmailAddress> is not used, but for clarity you may want to specify the
96
+ email address of the admin specified in `gam oauth create`.
97
+ ```
98
+ gdoc <EmailAddress> <DriveFileIDEntity>|<DriveFileNameEntity>|(<SharedDriveEntity> <SharedDriveFileNameEntity>)
99
+ gsheet <EmailAddress> <DriveFileIDEntity>|<DriveFileNameEntity>|(<SharedDriveEntity> <SharedDriveFileNameEntity>) <SheetEntity>
94
100
  ```
95
101
 
96
102
  ## Read data from a Google Cloud Storage File
@@ -10,6 +10,37 @@ 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.25.00
14
+
15
+ Removed a capabilty added in 7.24.00 that allowed reading command data from Google Docs and Sheets
16
+ when a user's service account access to Drive and Sheets had been disabled. Jay was concerned
17
+ that this change could be exploited to give access to all user's files.
18
+
19
+ This capability has been replaced by issuing the following commands. The admin specified in `gam oauth create`
20
+ can read command data from Docs and Sheets to which it has access.
21
+ ```
22
+ gam config commanddata_clientaccess true save
23
+ gam oauth create
24
+ Enable the following and proceed to authorization.
25
+
26
+ [*] 42) Drive API - commanddata_clientaccess
27
+ [*] 54) Sheets API - commanddata_clientaccess
28
+ ```
29
+
30
+ * See: https://github.com/GAM-team/GAM/wiki/Command-Data-From-Google-Docs-Sheets-Storage#limited-service-account-access
31
+
32
+ Fixed in bug in `gam report` that caused a trap with either of the `thismonth` or `previousmonths` options were used.
33
+
34
+ Upgraded to Python 3.14.0.
35
+
36
+ ### 7.24.01
37
+
38
+ Updated GAM to handle the following error that occurs when GAM tries to authenticate
39
+ as a user that has been disabled by Google.
40
+ ```
41
+ ERROR: Authentication Token Error - invalid_account: Forbidden
42
+ ```
43
+
13
44
  ### 7.24.00
14
45
 
15
46
  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,9 +252,9 @@ 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.25.00 - https://github.com/GAM-team/GAM - pyinstaller
256
256
  GAM Team <google-apps-manager@googlegroups.com>
257
- Python 3.13.7 64-bit final
257
+ Python 3.14.0 64-bit final
258
258
  macOS Tahoe 26.0.1 x86_64
259
259
  Path: /Users/admin/bin/gam7
260
260
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -990,9 +990,9 @@ 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.25.00 - https://github.com/GAM-team/GAM - pythonsource
994
994
  GAM Team <google-apps-manager@googlegroups.com>
995
- Python 3.13.7 64-bit final
995
+ Python 3.14.0 64-bit final
996
996
  Windows-10-10.0.17134 AMD64
997
997
  Path: C:\GAM7
998
998
  Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -336,10 +336,10 @@ issue the following command and make these settings:
336
336
  gam user user@domain.com update serviceaccount
337
337
 
338
338
  [ ] 20) Drive API (supports readonly)
339
- [*] 22) Drive API - write todrive data
339
+ [*] 22) Drive API - write todrive data - has access to all Drive
340
340
  [*] 31) Gmail API - Send Messages - including todrive
341
341
  [ ] 42) Sheets API (supports readonly)
342
- [*] 44) Sheets API - write todrive data
342
+ [*] 44) Sheets API - write todrive data - has access to all Sheets
343
343
  ```
344
344
 
345
345
  ## No Service Account Access
@@ -3,9 +3,9 @@
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.25.00 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
- Python 3.13.7 64-bit final
8
+ Python 3.14.0 64-bit final
9
9
  macOS Tahoe 26.0.1 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.24.00 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.25.00 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
- Python 3.13.7 64-bit final
20
+ Python 3.14.0 64-bit final
21
21
  macOS Tahoe 26.0.1 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.24.00 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.25.00 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
- Python 3.13.7 64-bit final
32
+ Python 3.14.0 64-bit final
33
33
  macOS Tahoe 26.0.1 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
@@ -68,7 +68,7 @@ MacOS High Sierra 10.13.6 x86_64
68
68
  Path: /Users/Admin/bin/gam7
69
69
  Version Check:
70
70
  Current: 5.35.08
71
- Latest: 7.22.00
71
+ Latest: 7.25.00
72
72
  echo $?
73
73
  1
74
74
  ```
@@ -76,7 +76,7 @@ echo $?
76
76
  Print the current version number without details
77
77
  ```
78
78
  gam version simple
79
- 7.22.00
79
+ 7.25.00
80
80
  ```
81
81
  In Linux/MacOS you can do:
82
82
  ```
@@ -86,9 +86,9 @@ echo $VER
86
86
  Print the current version of Gam and address of this Wiki
87
87
  ```
88
88
  gam help
89
- GAM 7.22.00 - https://github.com/GAM-team/GAM
89
+ GAM 7.25.00 - https://github.com/GAM-team/GAM
90
90
  GAM Team <google-apps-manager@googlegroups.com>
91
- Python 3.13.7 64-bit final
91
+ Python 3.14.0 64-bit final
92
92
  macOS Tahoe 26.0.1 x86_64
93
93
  Path: /Users/Admin/bin/gam7
94
94
  Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
@@ -140,6 +140,11 @@ cmdlog_max_kilo_bytes
140
140
  Maximum kilobytes per log file
141
141
  Default: 1000
142
142
  Range: 100 - 10000
143
+ commanddata_clientaccess
144
+ Enable/disable use of client access rather than service account access for the
145
+ admin specified in `gam oauth create` when reading command data from Docs and Sheets
146
+ to which it has access.
147
+ Default: False
143
148
  config_dir
144
149
  GAM config directory containing client_secrets.json, oauth2.txt, oauth2service.json
145
150
  and extra_args.txt
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes