gam7 7.10.6__tar.gz → 7.10.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

Files changed (318) hide show
  1. {gam7-7.10.6 → gam7-7.10.8}/.github/workflows/build.yml +0 -4
  2. {gam7-7.10.6 → gam7-7.10.8}/.github/workflows/pushwiki.yml +2 -0
  3. {gam7-7.10.6 → gam7-7.10.8}/PKG-INFO +1 -1
  4. {gam7-7.10.6 → gam7-7.10.8}/src/GamCommands.txt +1 -0
  5. {gam7-7.10.6 → gam7-7.10.8}/src/GamUpdate.txt +17 -2
  6. {gam7-7.10.6 → gam7-7.10.8}/src/gam/__init__.py +62 -19
  7. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glapi.py +41 -17
  8. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glgapi.py +1 -0
  9. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glmsgs.py +3 -3
  10. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glskus.py +2 -0
  11. {gam7-7.10.6 → gam7-7.10.8}/wiki/Authorization.md +10 -15
  12. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Identity-Devices.md +1 -0
  13. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Identity-Policies.md +16 -2
  14. {gam7-7.10.6 → gam7-7.10.8}/wiki/GamUpdates.md +14 -1
  15. {gam7-7.10.6 → gam7-7.10.8}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  16. {gam7-7.10.6 → gam7-7.10.8}/wiki/Licenses.md +1 -0
  17. {gam7-7.10.6 → gam7-7.10.8}/wiki/Version-and-Help.md +6 -6
  18. {gam7-7.10.6 → gam7-7.10.8}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  19. {gam7-7.10.6 → gam7-7.10.8}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  20. {gam7-7.10.6 → gam7-7.10.8}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  21. {gam7-7.10.6 → gam7-7.10.8}/.github/ISSUE_TEMPLATE.txt +0 -0
  22. {gam7-7.10.6 → gam7-7.10.8}/.github/actions/decrypt.sh +0 -0
  23. {gam7-7.10.6 → gam7-7.10.8}/.github/actions/entitlements.plist +0 -0
  24. {gam7-7.10.6 → gam7-7.10.8}/.github/actions/package_exclusions.txt +0 -0
  25. {gam7-7.10.6 → gam7-7.10.8}/.github/stale.yml +0 -0
  26. {gam7-7.10.6 → gam7-7.10.8}/.github/workflows/codeql-analysis.yml +0 -0
  27. {gam7-7.10.6 → gam7-7.10.8}/.github/workflows/get-cacerts.yml +0 -0
  28. {gam7-7.10.6 → gam7-7.10.8}/.github/workflows/pypi.yml +0 -0
  29. {gam7-7.10.6 → gam7-7.10.8}/.pre-commit-config.yaml +0 -0
  30. {gam7-7.10.6 → gam7-7.10.8}/LICENSE +0 -0
  31. {gam7-7.10.6 → gam7-7.10.8}/README.md +0 -0
  32. {gam7-7.10.6 → gam7-7.10.8}/pyproject.toml +0 -0
  33. {gam7-7.10.6 → gam7-7.10.8}/src/.gitignore +0 -0
  34. {gam7-7.10.6 → gam7-7.10.8}/src/LICENSE +0 -0
  35. {gam7-7.10.6 → gam7-7.10.8}/src/cacerts.pem +0 -0
  36. {gam7-7.10.6 → gam7-7.10.8}/src/callgam.py +0 -0
  37. {gam7-7.10.6 → gam7-7.10.8}/src/gam/__main__.py +0 -0
  38. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/__init__.py +0 -0
  39. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/auth.py +0 -0
  40. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/client.py +0 -0
  41. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/core.py +0 -0
  42. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/data.py +0 -0
  43. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/http.py +0 -0
  44. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/http_core.py +0 -0
  45. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/http_interface.py +0 -0
  46. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/mock_http.py +0 -0
  47. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/mock_http_core.py +0 -0
  48. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/mock_service.py +0 -0
  49. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/service.py +0 -0
  50. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/token_store.py +0 -0
  51. {gam7-7.10.6 → gam7-7.10.8}/src/gam/atom/url.py +0 -0
  52. {gam7-7.10.6 → gam7-7.10.8}/src/gam/cacerts.pem +0 -0
  53. {gam7-7.10.6 → gam7-7.10.8}/src/gam/cbcm-v1.1beta1.json +0 -0
  54. {gam7-7.10.6 → gam7-7.10.8}/src/gam/contactdelegation-v1.json +0 -0
  55. {gam7-7.10.6 → gam7-7.10.8}/src/gam/datastudio-v1.json +0 -0
  56. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/__init__.py +0 -0
  57. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glaction.py +0 -0
  58. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glcfg.py +0 -0
  59. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glclargs.py +0 -0
  60. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glentity.py +0 -0
  61. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glgdata.py +0 -0
  62. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glglobals.py +0 -0
  63. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glindent.py +0 -0
  64. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.10.6 → gam7-7.10.8}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/__init__.py +0 -0
  80. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/_auth.py +0 -0
  81. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/_helpers.py +0 -0
  82. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/channel.py +0 -0
  83. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/discovery.py +0 -0
  84. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  85. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  86. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  87. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  88. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/errors.py +0 -0
  89. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/http.py +0 -0
  90. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/mimeparse.py +0 -0
  91. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/model.py +0 -0
  92. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/schema.py +0 -0
  93. {gam7-7.10.6 → gam7-7.10.8}/src/gam/googleapiclient/version.py +0 -0
  94. {gam7-7.10.6 → gam7-7.10.8}/src/gam/iso8601/__init__.py +0 -0
  95. {gam7-7.10.6 → gam7-7.10.8}/src/gam/iso8601/iso8601.py +0 -0
  96. {gam7-7.10.6 → gam7-7.10.8}/src/gam/meet-v2beta.json +0 -0
  97. {gam7-7.10.6 → gam7-7.10.8}/src/gam/serviceaccountlookup-v1.json +0 -0
  98. {gam7-7.10.6 → gam7-7.10.8}/src/gam/six.py +0 -0
  99. {gam7-7.10.6 → gam7-7.10.8}/src/gam-install.sh +0 -0
  100. {gam7-7.10.6 → gam7-7.10.8}/src/gam-setup.bat +0 -0
  101. {gam7-7.10.6 → gam7-7.10.8}/src/gam.exe.manifest +0 -0
  102. {gam7-7.10.6 → gam7-7.10.8}/src/gam.py +0 -0
  103. {gam7-7.10.6 → gam7-7.10.8}/src/gam.spec +0 -0
  104. {gam7-7.10.6 → gam7-7.10.8}/src/gam.wxs +0 -0
  105. {gam7-7.10.6 → gam7-7.10.8}/src/license.rtf +0 -0
  106. {gam7-7.10.6 → gam7-7.10.8}/src/requirements-dev.txt +0 -0
  107. {gam7-7.10.6 → gam7-7.10.8}/src/requirements.txt +0 -0
  108. {gam7-7.10.6 → gam7-7.10.8}/src/setup.cfg +0 -0
  109. {gam7-7.10.6 → gam7-7.10.8}/src/setup.py +0 -0
  110. {gam7-7.10.6 → gam7-7.10.8}/src/tools/a_atleast_b.py +0 -0
  111. {gam7-7.10.6 → gam7-7.10.8}/src/tools/gen-wix-xml-filelist.py +0 -0
  112. {gam7-7.10.6 → gam7-7.10.8}/src/tools/mkGamRef.py +0 -0
  113. {gam7-7.10.6 → gam7-7.10.8}/src/tools/openssl.props +0 -0
  114. {gam7-7.10.6 → gam7-7.10.8}/src/version_info.txt.in +0 -0
  115. {gam7-7.10.6 → gam7-7.10.8}/wiki/00scratch.md +0 -0
  116. {gam7-7.10.6 → gam7-7.10.8}/wiki/Addresses.md +0 -0
  117. {gam7-7.10.6 → gam7-7.10.8}/wiki/Administrators.md +0 -0
  118. {gam7-7.10.6 → gam7-7.10.8}/wiki/Alert-Center.md +0 -0
  119. {gam7-7.10.6 → gam7-7.10.8}/wiki/Aliases.md +0 -0
  120. {gam7-7.10.6 → gam7-7.10.8}/wiki/BNF-Syntax.md +0 -0
  121. {gam7-7.10.6 → gam7-7.10.8}/wiki/Basic-Items.md +0 -0
  122. {gam7-7.10.6 → gam7-7.10.8}/wiki/Bulk-Processing.md +0 -0
  123. {gam7-7.10.6 → gam7-7.10.8}/wiki/CSV-Input-Filtering.md +0 -0
  124. {gam7-7.10.6 → gam7-7.10.8}/wiki/CSV-Output-Filtering.md +0 -0
  125. {gam7-7.10.6 → gam7-7.10.8}/wiki/CSV-Special-Characters.md +0 -0
  126. {gam7-7.10.6 → gam7-7.10.8}/wiki/Calendars-Access.md +0 -0
  127. {gam7-7.10.6 → gam7-7.10.8}/wiki/Calendars-Events.md +0 -0
  128. {gam7-7.10.6 → gam7-7.10.8}/wiki/Calendars.md +0 -0
  129. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chat-Bot.md +0 -0
  130. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-AUE-Counts.md +0 -0
  131. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  132. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Installed-Apps.md +0 -0
  133. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  134. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Policies.md +0 -0
  135. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Printers.md +0 -0
  136. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Profile-Management.md +0 -0
  137. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Version-Counts.md +0 -0
  138. {gam7-7.10.6 → gam7-7.10.8}/wiki/Chrome-Version-History.md +0 -0
  139. {gam7-7.10.6 → gam7-7.10.8}/wiki/ChromeOS-Devices.md +0 -0
  140. {gam7-7.10.6 → gam7-7.10.8}/wiki/Classroom-Courses.md +0 -0
  141. {gam7-7.10.6 → gam7-7.10.8}/wiki/Classroom-Guardians.md +0 -0
  142. {gam7-7.10.6 → gam7-7.10.8}/wiki/Classroom-Invitations.md +0 -0
  143. {gam7-7.10.6 → gam7-7.10.8}/wiki/Classroom-Membership.md +0 -0
  144. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Channel.md +0 -0
  145. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  146. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Identity-Groups.md +0 -0
  147. {gam7-7.10.6 → gam7-7.10.8}/wiki/Cloud-Storage.md +0 -0
  148. {gam7-7.10.6 → gam7-7.10.8}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  149. {gam7-7.10.6 → gam7-7.10.8}/wiki/Collections-of-Items.md +0 -0
  150. {gam7-7.10.6 → gam7-7.10.8}/wiki/Collections-of-Users.md +0 -0
  151. {gam7-7.10.6 → gam7-7.10.8}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  152. {gam7-7.10.6 → gam7-7.10.8}/wiki/Command-Line-Parsing.md +0 -0
  153. {gam7-7.10.6 → gam7-7.10.8}/wiki/Command-Logging-Progress.md +0 -0
  154. {gam7-7.10.6 → gam7-7.10.8}/wiki/Context-Aware-Access-Levels.md +0 -0
  155. {gam7-7.10.6 → gam7-7.10.8}/wiki/Customer.md +0 -0
  156. {gam7-7.10.6 → gam7-7.10.8}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  157. {gam7-7.10.6 → gam7-7.10.8}/wiki/Domain-SharedContacts.md +0 -0
  158. {gam7-7.10.6 → gam7-7.10.8}/wiki/Domains-Verification.md +0 -0
  159. {gam7-7.10.6 → gam7-7.10.8}/wiki/Domains.md +0 -0
  160. {gam7-7.10.6 → gam7-7.10.8}/wiki/Downloads-Installs.md +0 -0
  161. {gam7-7.10.6 → gam7-7.10.8}/wiki/Drive-File-Selection.md +0 -0
  162. {gam7-7.10.6 → gam7-7.10.8}/wiki/Drive-Items.md +0 -0
  163. {gam7-7.10.6 → gam7-7.10.8}/wiki/Drive-REST-API-v3.md +0 -0
  164. {gam7-7.10.6 → gam7-7.10.8}/wiki/Email-Audit-Monitor.md +0 -0
  165. {gam7-7.10.6 → gam7-7.10.8}/wiki/Find-File-Owner.md +0 -0
  166. {gam7-7.10.6 → gam7-7.10.8}/wiki/GAM-Public-Chat-Room.md +0 -0
  167. {gam7-7.10.6 → gam7-7.10.8}/wiki/GAM-Return-Codes.md +0 -0
  168. {gam7-7.10.6 → gam7-7.10.8}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  169. {gam7-7.10.6 → gam7-7.10.8}/wiki/GAM7-on-Android-Devices.md +0 -0
  170. {gam7-7.10.6 → gam7-7.10.8}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  171. {gam7-7.10.6 → gam7-7.10.8}/wiki/Google-Data-Transfers.md +0 -0
  172. {gam7-7.10.6 → gam7-7.10.8}/wiki/Google-Network-Addresses.md +0 -0
  173. {gam7-7.10.6 → gam7-7.10.8}/wiki/Groups-Membership.md +0 -0
  174. {gam7-7.10.6 → gam7-7.10.8}/wiki/Groups.md +0 -0
  175. {gam7-7.10.6 → gam7-7.10.8}/wiki/HTTPS-Proxy.md +0 -0
  176. {gam7-7.10.6 → gam7-7.10.8}/wiki/Home.md +0 -0
  177. {gam7-7.10.6 → gam7-7.10.8}/wiki/How-to-Install-GAM7.md +0 -0
  178. {gam7-7.10.6 → gam7-7.10.8}/wiki/How-to-Uninstall-GAM7.md +0 -0
  179. {gam7-7.10.6 → gam7-7.10.8}/wiki/How-to-Update-GAM7.md +0 -0
  180. {gam7-7.10.6 → gam7-7.10.8}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  181. {gam7-7.10.6 → gam7-7.10.8}/wiki/Inbound-SSO.md +0 -0
  182. {gam7-7.10.6 → gam7-7.10.8}/wiki/Install-GAM-as-Python-Library.md +0 -0
  183. {gam7-7.10.6 → gam7-7.10.8}/wiki/List-Items.md +0 -0
  184. {gam7-7.10.6 → gam7-7.10.8}/wiki/List.md +0 -0
  185. {gam7-7.10.6 → gam7-7.10.8}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  186. {gam7-7.10.6 → gam7-7.10.8}/wiki/Mobile-Devices.md +0 -0
  187. {gam7-7.10.6 → gam7-7.10.8}/wiki/Organizational-Units.md +0 -0
  188. {gam7-7.10.6 → gam7-7.10.8}/wiki/Other-Resources.md +0 -0
  189. {gam7-7.10.6 → gam7-7.10.8}/wiki/Permission-Matches.md +0 -0
  190. {gam7-7.10.6 → gam7-7.10.8}/wiki/Python-Regular-Expressions.md +0 -0
  191. {gam7-7.10.6 → gam7-7.10.8}/wiki/README.md +0 -0
  192. {gam7-7.10.6 → gam7-7.10.8}/wiki/Rclone.md +0 -0
  193. {gam7-7.10.6 → gam7-7.10.8}/wiki/Reports.md +0 -0
  194. {gam7-7.10.6 → gam7-7.10.8}/wiki/Reseller.md +0 -0
  195. {gam7-7.10.6 → gam7-7.10.8}/wiki/Resources.md +0 -0
  196. {gam7-7.10.6 → gam7-7.10.8}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  197. {gam7-7.10.6 → gam7-7.10.8}/wiki/SSL-Root-CA-Certificates.md +0 -0
  198. {gam7-7.10.6 → gam7-7.10.8}/wiki/Schemas.md +0 -0
  199. {gam7-7.10.6 → gam7-7.10.8}/wiki/Scripts.md +0 -0
  200. {gam7-7.10.6 → gam7-7.10.8}/wiki/Send-Email.md +0 -0
  201. {gam7-7.10.6 → gam7-7.10.8}/wiki/Shared-Drives.md +0 -0
  202. {gam7-7.10.6 → gam7-7.10.8}/wiki/Sites.md +0 -0
  203. {gam7-7.10.6 → gam7-7.10.8}/wiki/Tag-Replace.md +0 -0
  204. {gam7-7.10.6 → gam7-7.10.8}/wiki/Todrive.md +0 -0
  205. {gam7-7.10.6 → gam7-7.10.8}/wiki/Unmanaged-Accounts.md +0 -0
  206. {gam7-7.10.6 → gam7-7.10.8}/wiki/Upgrade-Benefits.md +0 -0
  207. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Analytics-Admin.md +0 -0
  208. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Application-Specific-Passwords.md +0 -0
  209. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Backup-Verification-Codes.md +0 -0
  210. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Calendars-Access.md +0 -0
  211. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Calendars-Events.md +0 -0
  212. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Calendars.md +0 -0
  213. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Chat.md +0 -0
  214. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Classification-Labels.md +0 -0
  215. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Classroom-Profile.md +0 -0
  216. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Contacts-Delegates.md +0 -0
  217. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Contacts.md +0 -0
  218. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Deprovision.md +0 -0
  219. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Activity-Settings.md +0 -0
  220. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Cleanup.md +0 -0
  221. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Comments.md +0 -0
  222. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Copy-Move.md +0 -0
  223. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Files-Display.md +0 -0
  224. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Files-Manage.md +0 -0
  225. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Orphans.md +0 -0
  226. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Ownership.md +0 -0
  227. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Permissions.md +0 -0
  228. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Query.md +0 -0
  229. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Revisions.md +0 -0
  230. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Shortcuts.md +0 -0
  231. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Drive-Transfer.md +0 -0
  232. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Forms.md +0 -0
  233. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-CSE.md +0 -0
  234. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Delegates.md +0 -0
  235. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Filters.md +0 -0
  236. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Forwarding.md +0 -0
  237. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Labels.md +0 -0
  238. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  239. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Profile.md +0 -0
  240. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-S-MIME.md +0 -0
  241. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  242. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Gmail-Settings.md +0 -0
  243. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Group-Membership.md +0 -0
  244. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Keep-Notes.md +0 -0
  245. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Looker-Studio.md +0 -0
  246. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Meet.md +0 -0
  247. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-People-Contacts-Profiles.md +0 -0
  248. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Photo.md +0 -0
  249. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Profile-Photo.md +0 -0
  250. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Profile-Sharing.md +0 -0
  251. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Shared-Drives.md +0 -0
  252. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  253. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Spreadsheets.md +0 -0
  254. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Tasks.md +0 -0
  255. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-Tokens.md +0 -0
  256. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users-YouTube.md +0 -0
  257. {gam7-7.10.6 → gam7-7.10.8}/wiki/Users.md +0 -0
  258. {gam7-7.10.6 → gam7-7.10.8}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  259. {gam7-7.10.6 → gam7-7.10.8}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  260. {gam7-7.10.6 → gam7-7.10.8}/wiki/Vault-Takeout.md +0 -0
  261. {gam7-7.10.6 → gam7-7.10.8}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  262. {gam7-7.10.6 → gam7-7.10.8}/wiki/_Sidebar.md +0 -0
  263. {gam7-7.10.6 → gam7-7.10.8}/wiki/gam.cfg.md +0 -0
  264. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Home.md +0 -0
  303. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Printers.md +0 -0
  312. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.10.6 → gam7-7.10.8}/wiki/l-_Footer.md +0 -0
@@ -457,10 +457,6 @@ jobs:
457
457
  - name: Custom wheels for Win arm64
458
458
  if: runner.os == 'Windows' && runner.arch == 'ARM64'
459
459
  run: |
460
- latest_lxml_whl=$(curl https://api.github.com/repos/GAM-team/lxml-wheel/releases/latest -s | jq -r .assets.[0].browser_download_url)
461
- echo "Downloading ${latest_lxml_whl}..."
462
- curl -O -L "$latest_lxml_whl"
463
- "$PYTHON" -m pip install lxml*.whl
464
460
  latest_crypt_whl=$(curl https://api.github.com/repos/jay0lee/cryptography/releases/latest -s | jq -r .assets.[0].browser_download_url)
465
461
  echo "Downloading ${latest_crypt_whl}..."
466
462
  curl -O -L "$latest_crypt_whl"
@@ -5,6 +5,8 @@ on:
5
5
  push:
6
6
  paths:
7
7
  - 'wiki/**'
8
+ workflow_dispatch:
9
+
8
10
  jobs:
9
11
  pushwiki:
10
12
  runs-on: ubuntu-latest
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.10.6
3
+ Version: 7.10.8
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
@@ -279,6 +279,7 @@ If an item contains spaces, it should be surrounded by ".
279
279
  geminiedu | 1010470004 | Gemini Education |
280
280
  geminiedupremium| 1010470005 | Gemini Education Premium |
281
281
  geminient| duetai | 1010470001 | Gemini Enterprise |
282
+ geminiultra | 1010470008 | Google AI Ultra for Business |
282
283
  gsuitebasic | gafb | gafw | basic | Google-Apps-For-Business |
283
284
  gsuitebusiness | gau | gsb | unlimited | Google-Apps-Unlimited |
284
285
  gsuitebusinessarchived | gsbau | businessarchived | 1010340002 | Google Workspace Business - Archived User |
@@ -1,10 +1,25 @@
1
+ 7.10.08
2
+
3
+ Fixed bug in commands that modify messages where the `labelids <LabelIdList>` option
4
+ could not be used unless one of these options was also specified: `query`, `matchlabel`, `ids`;
5
+ it can be now be used by itself.
6
+
7
+ 7.10.07
8
+
9
+ Updated `gam <UserTypeEntity> copy|move drivefile` to hanndle additional instances of
10
+ the `cannotModifyInheritedPermission` error.
11
+
12
+ Added license SKU `Google AI Ultra for Business`
13
+ * ProductID - 101047
14
+ * SKUID - 1010470008 | geminiultra
15
+
1
16
  7.10.06
2
17
 
3
- "gam print devices clientstates" to include client states in device output
18
+ Added option `clientstates` to `gam print devices` to include client states in device output.
4
19
 
5
20
  7.10.05
6
21
 
7
- Google renamed an error: cannotModifyInheritedTeamDrivePermission became cannotModifyInheritedPermission.
22
+ Google renamed an error: `cannotModifyInheritedTeamDrivePermission` became `cannotModifyInheritedPermission`.
8
23
  GAM will now handle the new error.
9
24
 
10
25
  7.10.04
@@ -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.10.06'
28
+ __version__ = '7.10.08'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -5187,6 +5187,12 @@ def checkGAPIError(e, softErrors=False, retryOnHttpError=False, mapNotFound=True
5187
5187
  return (0, None, None)
5188
5188
  else:
5189
5189
  systemErrorExit(HTTP_ERROR_RC, eContent)
5190
+ requiredScopes = ''
5191
+ wwwAuthenticate = e.resp.get('www-authenticate', '')
5192
+ if 'insufficient_scope' in wwwAuthenticate:
5193
+ mg = re.match(r'.+scope="(.+)"', wwwAuthenticate)
5194
+ if mg:
5195
+ requiredScopes = mg.group(1).split(' ')
5190
5196
  if 'error' in error:
5191
5197
  http_status = error['error']['code']
5192
5198
  reason = ''
@@ -5256,6 +5262,8 @@ def checkGAPIError(e, softErrors=False, retryOnHttpError=False, mapNotFound=True
5256
5262
  elif 'the authenticated user cannot access this service' in lmessage:
5257
5263
  error = makeErrorDict(http_status, GAPI.SERVICE_NOT_AVAILABLE, message)
5258
5264
  elif status == 'PERMISSION_DENIED' or 'the caller does not have permission' in lmessage or 'permission iam.serviceaccountkeys' in lmessage:
5265
+ if requiredScopes:
5266
+ message += f', {Msg.NO_SCOPES_FOR_API.format(API.findAPIforScope(requiredScopes))}'
5259
5267
  error = makeErrorDict(http_status, GAPI.PERMISSION_DENIED, message)
5260
5268
  elif http_status == 404:
5261
5269
  if status == 'NOT_FOUND' or 'requested entity was not found' in lmessage or 'does not exist' in lmessage:
@@ -8864,6 +8872,7 @@ class CSVPrintFile():
8864
8872
  GAPI.fileOrganizerNotYetEnabledForThisTeamDrive,
8865
8873
  GAPI.fileOrganizerOnFoldersInSharedDriveOnly,
8866
8874
  GAPI.fileOrganizerOnNonTeamDriveNotSupported,
8875
+ GAPI.cannotModifyInheritedPermission,
8867
8876
  GAPI.teamDrivesFolderSharingNotSupported, GAPI.invalidLinkVisibility,
8868
8877
  GAPI.invalidSharingRequest, GAPI.fileNeverWritable, GAPI.abusiveContentRestriction) as e:
8869
8878
  entityActionFailedWarning([Ent.USER, user, Ent.SPREADSHEET, title,
@@ -29957,7 +29966,7 @@ DEVICE_ORDERBY_CHOICE_MAP = {
29957
29966
  # [orderby <DeviceOrderByFieldName> [ascending|descending]]
29958
29967
  # [all|company|personal|nocompanydevices|nopersonaldevices]
29959
29968
  # [nodeviceusers|oneuserperrow]
29960
- # [clientstates]
29969
+ # [clientstates]
29961
29970
  # [formatjson [quotechar <Character>]]
29962
29971
  # [showitemcountonly]
29963
29972
  def doPrintCIDevices():
@@ -59522,6 +59531,7 @@ def _copyPermissions(drive, user, i, count, j, jcount,
59522
59531
  GAPI.fileOrganizerNotYetEnabledForThisTeamDrive,
59523
59532
  GAPI.fileOrganizerOnFoldersInSharedDriveOnly,
59524
59533
  GAPI.fileOrganizerOnNonTeamDriveNotSupported,
59534
+ GAPI.cannotModifyInheritedPermission,
59525
59535
  GAPI.teamDrivesFolderSharingNotSupported, GAPI.invalidLinkVisibility, GAPI.abusiveContentRestriction) as e:
59526
59536
  entityActionFailedWarning(kvList, str(e), k, kcount)
59527
59537
  break
@@ -60629,6 +60639,7 @@ def _updateMoveFilePermissions(drive, user, i, count,
60629
60639
  GAPI.fileOrganizerNotYetEnabledForThisTeamDrive,
60630
60640
  GAPI.fileOrganizerOnFoldersInSharedDriveOnly,
60631
60641
  GAPI.fileOrganizerOnNonTeamDriveNotSupported,
60642
+ GAPI.cannotModifyInheritedPermission,
60632
60643
  GAPI.teamDrivesFolderSharingNotSupported, GAPI.invalidLinkVisibility, GAPI.abusiveContentRestriction) as e:
60633
60644
  entityActionFailedWarning(kvList, str(e), k, kcount)
60634
60645
  break
@@ -63883,6 +63894,7 @@ def createDriveFileACL(users, useDomainAdminAccess=False):
63883
63894
  GAPI.fileOrganizerNotYetEnabledForThisTeamDrive,
63884
63895
  GAPI.fileOrganizerOnFoldersInSharedDriveOnly,
63885
63896
  GAPI.fileOrganizerOnNonTeamDriveNotSupported,
63897
+ GAPI.cannotModifyInheritedPermission,
63886
63898
  GAPI.teamDrivesFolderSharingNotSupported, GAPI.invalidLinkVisibility,
63887
63899
  GAPI.invalidSharingRequest, GAPI.fileNeverWritable, GAPI.abusiveContentRestriction) as e:
63888
63900
  entityActionFailedWarning([Ent.USER, user, entityType, fileName, Ent.PERMISSION_ID, permissionId], str(e), j, jcount)
@@ -64118,6 +64130,7 @@ def createDriveFilePermissions(users, useDomainAdminAccess=False):
64118
64130
  GAPI.fileOrganizerNotYetEnabledForThisTeamDrive,
64119
64131
  GAPI.fileOrganizerOnFoldersInSharedDriveOnly,
64120
64132
  GAPI.fileOrganizerOnNonTeamDriveNotSupported,
64133
+ GAPI.cannotModifyInheritedPermission,
64121
64134
  GAPI.teamDrivesFolderSharingNotSupported, GAPI.invalidLinkVisibility,
64122
64135
  GAPI.invalidSharingRequest, GAPI.fileNeverWritable, GAPI.abusiveContentRestriction,
64123
64136
  GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
@@ -70242,14 +70255,16 @@ def _finalizeMessageSelectParameters(parameters, queryOrIdsRequired):
70242
70255
  for queryTimeName, queryTimeValue in iter(parameters['queryTimes'].items()):
70243
70256
  parameters['query'] = parameters['query'].replace(f'#{queryTimeName}#', queryTimeValue)
70244
70257
  _mapMessageQueryDates(parameters)
70245
- elif queryOrIdsRequired and parameters['messageEntity'] is None:
70246
- missingArgumentExit('query|matchlabel|ids')
70258
+ elif queryOrIdsRequired and parameters['messageEntity'] is None and not parameters['labelIds']:
70259
+ missingArgumentExit('query|matchlabel|ids|labelids')
70247
70260
  else:
70248
70261
  parameters['query'] = None
70249
70262
  parameters['maxItems'] = parameters['maxToProcess'] if parameters['quick'] and not parameters['labelMatchPattern'] else 0
70250
70263
 
70251
70264
  # gam <UserTypeEntity> archive messages <GroupItem>
70252
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_archive <Number>])|(ids <MessageIDEntity>)
70265
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70266
+ # [labelids <LabelIDList>]
70267
+ # [quick|notquick] [doit] [max_to_archive <Number>])|(ids <MessageIDEntity>)
70253
70268
  # [csv [todrive <ToDriveAttribute>*]]
70254
70269
  def archiveMessages(users):
70255
70270
  def _processMessageFailed(user, idsList, errMsg, j=0, jcount=0):
@@ -70534,39 +70549,59 @@ def _processMessagesThreads(users, entityType):
70534
70549
  csvPF.writeCSVfile(f'{Act.ToPerform()} Messages')
70535
70550
 
70536
70551
  # gam <UserTypeEntity> delete message|messages
70537
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_delete <Number>])|(ids <MessageIDEntity>)
70552
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70553
+ # [labelids <LabelIDList>]
70554
+ # [quick|notquick] [doit] [max_to_delete <Number>])|(ids <MessageIDEntity>)
70538
70555
  # [csv [todrive <ToDriveAttribute>*]]
70539
70556
  # gam <UserTypeEntity> modify message|messages
70540
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_modify <Number>])|(ids <MessageIDEntity>)
70557
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70558
+ # [labelids <LabelIDList>]
70559
+ # [quick|notquick] [doit] [max_to_modify <Number>])|(ids <MessageIDEntity>)
70541
70560
  # (addlabel <LabelName>)* (removelabel <LabelName>)*
70542
70561
  # [csv [todrive <ToDriveAttribute>*]]
70543
70562
  # gam <UserTypeEntity> spam message|messages
70544
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_spam <Number>])|(ids <MessageIDEntity>)
70563
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70564
+ # [labelids <LabelIDList>]
70565
+ # [quick|notquick] [doit] [max_to_spam <Number>])|(ids <MessageIDEntity>)
70545
70566
  # [csv [todrive <ToDriveAttribute>*]]
70546
70567
  # gam <UserTypeEntity> trash message|messages
70547
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_trash <Number>])|(ids <MessageIDEntity>)
70568
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70569
+ # [labelids <LabelIDList>]
70570
+ # [quick|notquick] [doit] [max_to_trash <Number>])|(ids <MessageIDEntity>)
70548
70571
  # [csv [todrive <ToDriveAttribute>*]]
70549
70572
  # gam <UserTypeEntity> untrash message|messages
70550
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_untrash <Number>])|(ids <MessageIDEntity>)
70573
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70574
+ # [labelids <LabelIDList>]
70575
+ # [quick|notquick] [doit] [max_to_untrash <Number>])|(ids <MessageIDEntity>)
70551
70576
  # [csv [todrive <ToDriveAttribute>*]]
70552
70577
  def processMessages(users):
70553
70578
  _processMessagesThreads(users, Ent.MESSAGE)
70554
70579
 
70555
70580
  # gam <UserTypeEntity> delete thread|threads
70556
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_delete <Number>])|(ids <ThreadIDEntity>)
70581
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70582
+ # [labelids <LabelIDList>]
70583
+ # [quick|notquick] [doit] [max_to_delete <Number>])|(ids <ThreadIDEntity>)
70557
70584
  # [csv [todrive <ToDriveAttribute>*]]
70558
70585
  # gam <UserTypeEntity> modify thread|threads
70559
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_modify <Number>])|(ids <ThreadIDEntity>)
70586
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70587
+ # [labelids <LabelIDList>]
70588
+ # [quick|notquick] [doit] [max_to_modify <Number>])|(ids <ThreadIDEntity>)
70560
70589
  # (addlabel <LabelName>)* (removelabel <LabelName>)*
70561
70590
  # [csv [todrive <ToDriveAttribute>*]]
70562
70591
  # gam <UserTypeEntity> spam thread|threads
70563
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_spam <Number>])|(ids <ThreadIDEntity>)
70592
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70593
+ # [labelids <LabelIDList>]
70594
+ # [quick|notquick] [doit] [max_to_spam <Number>])|(ids <ThreadIDEntity>)
70564
70595
  # [csv [todrive <ToDriveAttribute>*]]
70565
70596
  # gam <UserTypeEntity> trash thread|threads
70566
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_trash <Number>])|(ids <MessageIDEntity>)
70597
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70598
+ # [labelids <LabelIDList>]
70599
+ # [quick|notquick] [doit] [max_to_trash <Number>])|(ids <ThreadIDEntity>)
70567
70600
  # [csv [todrive <ToDriveAttribute>*]]
70568
70601
  # gam <UserTypeEntity> untrash thread|threads
70569
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+ [quick|notquick] [doit] [max_to_untrash <Number>])|(ids <ThreadIDEntity>)
70602
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])+
70603
+ # [labelids <LabelIDList>]
70604
+ # [quick|notquick] [doit] [max_to_untrash <Number>])|(ids <ThreadIDEntity>)
70570
70605
  # [csv [todrive <ToDriveAttribute>*]]
70571
70606
  def processThreads(users):
70572
70607
  _processMessagesThreads(users, Ent.THREAD)
@@ -71988,7 +72023,9 @@ def printShowMessagesThreads(users, entityType):
71988
72023
  csvPF.writeCSVfile('Message Counts' if not show_labels else 'Message Label Counts')
71989
72024
 
71990
72025
  # gam <UserTypeEntity> print message|messages [todrive <ToDriveAttribute>*]
71991
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
72026
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
72027
+ # [labelids <LabelIDList>]
72028
+ # [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
71992
72029
  # [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
71993
72030
  # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
71994
72031
  # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
@@ -71998,7 +72035,9 @@ def printShowMessagesThreads(users, entityType):
71998
72035
  # [showattachments [noshowtextplain]]]
71999
72036
  # (addcsvdata <FieldName> <String>)*
72000
72037
  # gam <UserTypeEntity> show message|messages
72001
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
72038
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
72039
+ # [labelids <LabelIDList>]
72040
+ # [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
72002
72041
  # [labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
72003
72042
  # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
72004
72043
  # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
@@ -72011,7 +72050,9 @@ def printShowMessages(users):
72011
72050
  printShowMessagesThreads(users, Ent.MESSAGE)
72012
72051
 
72013
72052
  # gam <UserTypeEntity> print thread|threads [todrive <ToDriveAttribute>*]
72014
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
72053
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
72054
+ # [labelids <LabelIDList>]
72055
+ # [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
72015
72056
  # [labelmatchpattern <REMatchPattern>]
72016
72057
  # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
72017
72058
  # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
@@ -72021,7 +72062,9 @@ def printShowMessages(users):
72021
72062
  # [showattachments [noshowtextplain]]]
72022
72063
  # (addcsvdata <FieldName> <String>)*
72023
72064
  # gam <UserTypeEntity> show thread|threads
72024
- # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
72065
+ # (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])*
72066
+ # [labelids <LabelIDList>]
72067
+ # [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
72025
72068
  # [labelmatchpattern <REMatchPattern>]
72026
72069
  # [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
72027
72070
  # [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
@@ -226,15 +226,15 @@ _INFO = {
226
226
  CHROMEMANAGEMENT_TELEMETRY: {'name': 'Chrome Management API - Telemetry', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHROMEMANAGEMENT},
227
227
  CHROMEPOLICY: {'name': 'Chrome Policy API', 'version': 'v1', 'v2discovery': True},
228
228
  CHROMEVERSIONHISTORY: {'name': 'Chrome Version History API', 'version': 'v1', 'v2discovery': True},
229
- CLOUDCHANNEL: {'name': 'Channel Channel API', 'version': 'v1', 'v2discovery': True},
230
- CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity Devices API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
231
- CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity Groups API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
232
- CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity Groups API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
233
- CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity Inbound SSO API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
234
- CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
235
- CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
236
- CLOUDIDENTITY_POLICY: {'name': 'Cloud Identity Policy API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
237
- CLOUDIDENTITY_USERINVITATIONS: {'name': 'Cloud Identity User Invitations API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
229
+ CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
230
+ CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
231
+ CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
232
+ CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
233
+ CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
234
+ CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
235
+ CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
236
+ CLOUDIDENTITY_POLICY: {'name': 'Cloud Identity API - Policy', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
237
+ CLOUDIDENTITY_USERINVITATIONS: {'name': 'Cloud Identity API - User Invitations', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
238
238
  CLOUDRESOURCEMANAGER: {'name': 'Cloud Resource Manager API v3', 'version': 'v3', 'v2discovery': True},
239
239
  CONTACTS: {'name': 'Contacts API', 'version': 'v3', 'v2discovery': False},
240
240
  CONTACTDELEGATION: {'name': 'Contact Delegation API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
@@ -258,13 +258,13 @@ _INFO = {
258
258
  LICENSING: {'name': 'License Manager API', 'version': 'v1', 'v2discovery': True},
259
259
  LOOKERSTUDIO: {'name': 'Looker Studio API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
260
260
  MEET: {'name': 'Meet API', 'version': 'v2', 'v2discovery': True},
261
- MEET_BETA: {'name': 'Meet API', 'version': 'v2beta', 'v2discovery': True, 'localjson': True, 'mappedAPI': MEET},
261
+ MEET_BETA: {'name': 'Meet API Beta', 'version': 'v2beta', 'v2discovery': True, 'localjson': True, 'mappedAPI': MEET},
262
262
  OAUTH2: {'name': 'OAuth2 API', 'version': 'v2', 'v2discovery': False},
263
263
  ORGPOLICY: {'name': 'Organization Policy API', 'version': 'v2', 'v2discovery': True},
264
264
  PEOPLE: {'name': 'People API', 'version': 'v1', 'v2discovery': True},
265
265
  PEOPLE_DIRECTORY: {'name': 'People Directory API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
266
266
  PEOPLE_OTHERCONTACTS: {'name': 'People API - Other Contacts', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
267
- PRINTERS: {'name': 'Directory API Printers', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
267
+ PRINTERS: {'name': 'Directory API - Printers', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
268
268
  PUBSUB: {'name': 'Pub / Sub API', 'version': 'v1', 'v2discovery': True},
269
269
  REPORTS: {'name': 'Reports API', 'version': 'reports_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
270
270
  RESELLER: {'name': 'Reseller API', 'version': 'v1', 'v2discovery': True},
@@ -362,29 +362,29 @@ _CLIENT_SCOPES = [
362
362
  'subscopes': READONLY,
363
363
  'offByDefault': True,
364
364
  'scope': 'https://www.googleapis.com/auth/apps.order'},
365
- {'name': 'Cloud Identity Groups API',
365
+ {'name': 'Cloud Identity API - Groups',
366
366
  'api': CLOUDIDENTITY_GROUPS,
367
367
  'subscopes': READONLY,
368
368
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
369
- {'name': 'Cloud Identity Groups API Beta (Enables group locking/unlocking)',
369
+ {'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
370
370
  'api': CLOUDIDENTITY_GROUPS_BETA,
371
371
  'subscopes': [],
372
372
  'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
373
- {'name': 'Cloud Identity - Inbound SSO Settings',
373
+ {'name': 'Cloud Identity API - Inbound SSO Settings',
374
374
  'api': CLOUDIDENTITY_INBOUND_SSO,
375
375
  'subscopes': READONLY,
376
376
  'scope': 'https://www.googleapis.com/auth/cloud-identity.inboundsso'},
377
- {'name': 'Cloud Identity OrgUnits API',
377
+ {'name': 'Cloud Identity API - OrgUnits Beta',
378
378
  'api': CLOUDIDENTITY_ORGUNITS_BETA,
379
379
  'subscopes': READONLY,
380
380
  'scope': 'https://www.googleapis.com/auth/cloud-identity.orgunits'},
381
- {'name': 'Cloud Identity - Policy',
381
+ {'name': 'Cloud Identity API - Policy',
382
382
  'api': CLOUDIDENTITY_POLICY,
383
383
  'subscopes': READONLY,
384
384
  'roByDefault': True,
385
385
  'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'
386
386
  },
387
- {'name': 'Cloud Identity User Invitations API',
387
+ {'name': 'Cloud Identity API - User Invitations',
388
388
  'api': CLOUDIDENTITY_USERINVITATIONS,
389
389
  'subscopes': READONLY,
390
390
  'scope': 'https://www.googleapis.com/auth/cloud-identity.userinvitations'},
@@ -833,3 +833,27 @@ def getSvcAcctScopesList(userServiceAccountAccessOnly, svcAcctSpecialScopes):
833
833
 
834
834
  def hasLocalJSON(api):
835
835
  return _INFO[api].get('localjson', False)
836
+
837
+ def findAPIforScope(scopesList):
838
+ def checkScopeMatch(scope, cscope):
839
+ if cscope['scope'] == scope:
840
+ requiredAPIs.append(cscope['name'])
841
+ return True
842
+ if cscope['subscopes'] == READONLY and cscope['scope']+'.readonly' == scope:
843
+ requiredAPIs.append(cscope['name']+' (supports readonly)')
844
+ return True
845
+ return False
846
+
847
+ requiredAPIs = []
848
+ for scope in scopesList:
849
+ for cscope in _CLIENT_SCOPES:
850
+ if checkScopeMatch(scope, cscope):
851
+ break
852
+ else:
853
+ for cscope in _SVCACCT_SCOPES:
854
+ if checkScopeMatch(scope, cscope):
855
+ break
856
+ if not requiredAPIs:
857
+ requiredAPIs = scopesList
858
+ return ' or '.join(requiredAPIs)
859
+
@@ -229,6 +229,7 @@ DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST
229
229
  FILE_ORGANIZER_NOT_YET_ENABLED_FOR_THIS_TEAMDRIVE,
230
230
  FILE_ORGANIZER_ON_FOLDERS_IN_SHARED_DRIVE_ONLY,
231
231
  FILE_ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED,
232
+ CANNOT_MODIFY_INHERITED_PERMISSION,
232
233
  TEAMDRIVES_FOLDER_SHARING_NOT_SUPPORTED, INVALID_LINK_VISIBILITY, ABUSIVE_CONTENT_RESTRICTION]
233
234
  DRIVE3_GET_ACL_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
234
235
  INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
@@ -184,8 +184,8 @@ ALREADY_EXISTS_IN_TARGET_FOLDER = 'Already exists in {0}: {1}'
184
184
  ALREADY_EXISTS_USE_MERGE_ARGUMENT = 'Already exists; use the "merge" argument to merge the labels'
185
185
  API_ACCESS_DENIED = 'API access Denied'
186
186
  API_CALLS_RETRY_DATA = 'API calls retry data\n'
187
- API_CHECK_CLIENT_AUTHORIZATION = 'Please make sure the Client ID: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam oauth create\n'
188
- API_CHECK_SVCACCT_AUTHORIZATION = 'Please make sure the Service Account Client ID: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam user {2} update serviceaccount\n'
187
+ API_CHECK_CLIENT_AUTHORIZATION = 'Please make sure the Client ID: {0} is authorized for the appropriate API or scopes: {1}\n\nRun: gam oauth create\n'
188
+ API_CHECK_SVCACCT_AUTHORIZATION = 'Please make sure the Service Account Client ID: {0} is authorized for the appropriate API or scopes: {1}\n\nRun: gam user {2} update serviceaccount\n'
189
189
  API_ERROR_SETTINGS = 'API error, some settings not set'
190
190
  ARE_BOTH_REQUIRED = 'Arguments {0} and {1} are both required'
191
191
  ARE_MUTUALLY_EXCLUSIVE = 'Arguments {0} and {1} are mutually exclusive'
@@ -425,7 +425,7 @@ NO_LABELS_TO_PROCESS = 'No Labels to process'
425
425
  NO_MESSAGES_WITH_LABEL = 'No Messages with Label'
426
426
  NO_PARENTS_TO_CONVERT_TO_SHORTCUTS = 'No parents to convert to shortcuts'
427
427
  NO_REPORT_AVAILABLE = 'No {0} report available.'
428
- NO_SCOPES_FOR_API = 'There are no scopes authorized for the {0}'
428
+ NO_SCOPES_FOR_API = 'There are no scopes authorized for the API(s): {0}'
429
429
  NO_SERIAL_NUMBERS_SPECIFIED = 'No serial numbers specified'
430
430
  NO_SSO_PROFILE_MATCHES = 'No SSO profile matches display name {0}'
431
431
  NO_SSO_PROFILE_ASSIGNED = 'No SSO profile assigned to {0} {1}'
@@ -107,6 +107,8 @@ _SKUS = {
107
107
  'product': '101047', 'aliases': ['aisecurity'], 'displayName': 'AI Security'},
108
108
  '1010470007': {
109
109
  'product': '101047', 'aliases': ['aimeetingsandmessaging'], 'displayName': 'AI Meetings and Messaging'},
110
+ '1010470008': {
111
+ 'product': '101047', 'aliases': ['geminiultra'], 'displayName': 'Google AI Ultra for Business'},
110
112
  '1010490001': {
111
113
  'product': '101049', 'aliases': ['eeu'], 'displayName': 'Endpoint Education Upgrade'},
112
114
  '1010500001': {
@@ -5,7 +5,7 @@
5
5
  - [Python Regular Expressions](Python-Regular-Expressions)
6
6
  - [Definitions](#definitions)
7
7
  - [Manage Projects](#manage-projects)
8
- - [Authorize a super admin to create projects](#authorize-a-super-admin-to-create-projects)
8
+ - [Authorize a user to create projects](#authorize-a-user-to-create-projects)
9
9
  - [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
10
10
  - [Authorize GAM to create projects](#authorize-gam-to-create-projects)
11
11
  - [Create a new GCP project folder](#create-a-new-gcp-project-folder)
@@ -74,11 +74,6 @@ Verify that all scopes are available:
74
74
  * Select "ON for everyone"
75
75
  * Click "SAVE"
76
76
 
77
- Verify that internal apps are trusted.
78
- * Access the admin console and go to Security -> Access and data control -> API Controls
79
- * Check that "Trust internal, domain-owned apps" is present in the **Settings** section
80
- * Click "SAVE"
81
-
82
77
  If you run a Google Workspace Education SKU, verify that Classroom API is enabled if required.
83
78
  * Access the admin console and go to Apps -> Google Workspace - Classroom
84
79
  * Expand "Data access"
@@ -110,12 +105,13 @@ Verify whether the super admin you'll be using is in an OU where reauthenticatio
110
105
  * Access the admin console and go to Security -> Overview
111
106
  * Scroll down and open Google Cloud session control section
112
107
  * Select the OU containing the super admin
113
- * If Require reauthentication is selected and Exempt Trusted apps is not checked, you'll have to do `gam oauth create` at whatever frequency is specified
114
- * If that sounds unappealing, check Exempt Trusted apps
115
- * Click "OVERRIDE"
108
+ * If Require reauthentication is selected, you'll need either:
109
+ * uncheck Google Cloud Storage and any other GCP APIs that you selected on `gam oauth create` (reauth is only necessary for GCP APIs)
110
+ * enable "Exempt Trusted apps"
111
+ * rerun `gam oauth create` at whatever frequency is specified
116
112
 
117
113
  Additional steps may be required if errors are encountered.
118
- * [Authorize a super admin to create projects](#authorize-a-super-admin-to-create-projects)
114
+ * [Authorize a user to create projects](#authorize-a-user-to-create-projects)
119
115
  * [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
120
116
  * [Authorize GAM to create projects](#authorize-gam-to-create-projects)
121
117
 
@@ -169,8 +165,8 @@ For `print|show projects`, you can eliminate the password prompt and authenticat
169
165
  gam print projects admin admin@domain.com
170
166
  ```
171
167
 
172
- ## Authorize a super admin to create projects
173
- If you try to create a project and get an error saying that the admin you specified is not authorized to create projects,
168
+ ## Authorize a user to create projects
169
+ If you try to create a project and get an error saying that the user you specified is not authorized to create projects,
174
170
  perform these steps and then retry the create project command.
175
171
 
176
172
  * Login as an existing super admin at console.cloud.google.com
@@ -184,13 +180,12 @@ perform these steps and then retry the create project command.
184
180
  * Click in the Select a role box
185
181
  * Type project creator in the Filter box
186
182
  * Click Project Creator
187
- * Click + Add Another Role
188
- * Type orgpolicy.policyAdmin in the Filter box
189
- * Click Organization Policy Administrator
190
183
  * Click Save
191
184
 
192
185
  ## Authorize Service Account Key Uploads
193
186
 
187
+ *IMPORTANT:* Google best practice is to NOT use service account keys. Rather than overriding Google's default policy please consider [running GAM on Google Compute Engine Securely](https://github.com/GAM-team/GAM/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely) so that service account keys are not necessary.
188
+
194
189
  If you try to create a project and get an error saying that Constraint `constraints/iam.disableServiceAccountKeyUpload violated for service account projects/gam-project-xxxxx`,
195
190
  perform these steps and then you should be able to authorize and use your project.
196
191
 
@@ -211,6 +211,7 @@ gam print devices [todrive <ToDriveAttribute>*]
211
211
  [orderby <DeviceOrderByFieldName> [ascending|descending]]
212
212
  [all|company|personal|nocompanydevices|nopersonaldevices]
213
213
  [nodeviceusers|oneuserperrow]
214
+ [clientstates]
214
215
  [formatjson [quotechar <Character>]]
215
216
  ```
216
217
  By default, all devices are displayed; use the query options to limit the display.
@@ -12,14 +12,28 @@
12
12
 
13
13
  ## Notes
14
14
  To use these commands you must update your client access authentication.
15
- You'll enter 19R to turn on the Cloud Identity Policy scope; then continue
15
+ You'll enter 20r to turn on the Cloud Identity Policy scope; then continue
16
16
  with authentication.
17
17
  ```
18
18
  gam oauth delete
19
19
  gam oauth create
20
20
  ...
21
- [R] 19) Cloud Identity - Policy
21
+ [R] 20) Cloud Identity - Policy (supports readonly)
22
22
  ```
23
+ You must enable access to policies in the GCP cloud console.
24
+
25
+ * Login at console.cloud.google.com
26
+ * In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
27
+ * Under IAM & Admin select IAM
28
+ * Click in the box to the right of Google Cloud
29
+ * Click the three dots at the right and select IAM/Permissions
30
+ * Now you should be at "Permissions for organization ..."
31
+ * Click on Grant Access
32
+ * Enter the GAM project creator address in Principals
33
+ * Click in the Select a role box
34
+ * Type orgpolicy.policyAdmin in the Filter box
35
+ * Click Organization Policy Administrator
36
+ * Click Save
23
37
 
24
38
  ## Definitions
25
39
  ```
@@ -10,9 +10,22 @@ 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.10.07
14
+
15
+ Updated `gam <UserTypeEntity> copy|move drivefile` to hanndle additional instances of
16
+ the `cannotModifyInheritedPermission` error.
17
+
18
+ Added license SKU `Google AI Ultra for Business`
19
+ * ProductID - 101047
20
+ * SKUID - 1010470008 | geminiultra
21
+
22
+ ### 7.10.06
23
+
24
+ Added option `clientstates` to `gam print devices` to include client states in device output.
25
+
13
26
  ### 7.10.05
14
27
 
15
- Google renamed an error: cannotModifyInheritedTeamDrivePermission became cannotModifyInheritedPermission.
28
+ Google renamed an error: `cannotModifyInheritedTeamDrivePermission` became `cannotModifyInheritedPermission`.
16
29
  GAM will now handle the new error.
17
30
 
18
31
  ### 7.10.04
@@ -251,7 +251,7 @@ writes the credentials into the file oauth2.txt.
251
251
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
252
252
  admin@server:/Users/admin$ gam version
253
253
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
254
- GAM 7.10.05 - https://github.com/GAM-team/GAM - pyinstaller
254
+ GAM 7.10.07 - https://github.com/GAM-team/GAM - pyinstaller
255
255
  GAM Team <google-apps-manager@googlegroups.com>
256
256
  Python 3.13.5 64-bit final
257
257
  MacOS Sequoia 15.5 x86_64
@@ -989,7 +989,7 @@ writes the credentials into the file oauth2.txt.
989
989
  C:\>del C:\GAMConfig\oauth2.txt
990
990
  C:\>gam version
991
991
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
992
- GAM 7.10.05 - https://github.com/GAM-team/GAM - pythonsource
992
+ GAM 7.10.07 - https://github.com/GAM-team/GAM - pythonsource
993
993
  GAM Team <google-apps-manager@googlegroups.com>
994
994
  Python 3.13.5 64-bit final
995
995
  Windows-10-10.0.17134 AMD64
@@ -62,6 +62,7 @@
62
62
  | Gemini Education | 1010470004 | geminiedu |
63
63
  | Gemini Education Premium | 1010470005 | geminiedupremium |
64
64
  | Gemini Enterprise | 1010470001 | geminient | duetai |
65
+ | Google AI Ultra for Business | 1010470008 | geminiultra |
65
66
  | Google Apps Message Security | Google-Apps-For-Postini | postini |
66
67
  | Google Chrome Device Management | Google-Chrome-Device-Management | cdm |
67
68
  | Google Drive Storage 16TB | Google-Drive-storage-16TB | 16tb |