gam7 7.23.4__tar.gz → 7.23.6__tar.gz

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

Potentially problematic release.


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

Files changed (303) hide show
  1. {gam7-7.23.4 → gam7-7.23.6}/.github/workflows/build.yml +5 -4
  2. {gam7-7.23.4 → gam7-7.23.6}/.github/workflows/pypi.yml +1 -1
  3. {gam7-7.23.4 → gam7-7.23.6}/PKG-INFO +1 -1
  4. {gam7-7.23.4 → gam7-7.23.6}/src/GamCommands.txt +8 -3
  5. {gam7-7.23.4 → gam7-7.23.6}/src/GamUpdate.txt +14 -0
  6. {gam7-7.23.4 → gam7-7.23.6}/src/gam/__init__.py +98 -30
  7. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glclargs.py +1 -0
  8. {gam7-7.23.4 → gam7-7.23.6}/wiki/Administrators.md +8 -4
  9. {gam7-7.23.4 → gam7-7.23.6}/wiki/Calendars-Events.md +7 -3
  10. {gam7-7.23.4 → gam7-7.23.6}/wiki/GamUpdates.md +17 -0
  11. {gam7-7.23.4 → gam7-7.23.6}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +1 -1
  12. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Calendars-Events.md +6 -3
  13. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-People-Contacts-Profiles.md +8 -8
  14. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Tasks.md +3 -3
  15. {gam7-7.23.4 → gam7-7.23.6}/wiki/Version-and-Help.md +3 -3
  16. {gam7-7.23.4 → gam7-7.23.6}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  17. {gam7-7.23.4 → gam7-7.23.6}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  18. {gam7-7.23.4 → gam7-7.23.6}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  19. {gam7-7.23.4 → gam7-7.23.6}/.github/ISSUE_TEMPLATE.txt +0 -0
  20. {gam7-7.23.4 → gam7-7.23.6}/.github/actions/decrypt.sh +0 -0
  21. {gam7-7.23.4 → gam7-7.23.6}/.github/actions/entitlements.plist +0 -0
  22. {gam7-7.23.4 → gam7-7.23.6}/.github/actions/package_exclusions.txt +0 -0
  23. {gam7-7.23.4 → gam7-7.23.6}/.github/stale.yml +0 -0
  24. {gam7-7.23.4 → gam7-7.23.6}/.github/workflows/codeql-analysis.yml +0 -0
  25. {gam7-7.23.4 → gam7-7.23.6}/.github/workflows/get-cacerts.yml +0 -0
  26. {gam7-7.23.4 → gam7-7.23.6}/.github/workflows/pushwiki.yml +0 -0
  27. {gam7-7.23.4 → gam7-7.23.6}/LICENSE +0 -0
  28. {gam7-7.23.4 → gam7-7.23.6}/README.md +0 -0
  29. {gam7-7.23.4 → gam7-7.23.6}/pyproject.toml +0 -0
  30. {gam7-7.23.4 → gam7-7.23.6}/src/.gitignore +0 -0
  31. {gam7-7.23.4 → gam7-7.23.6}/src/LICENSE +0 -0
  32. {gam7-7.23.4 → gam7-7.23.6}/src/README.md +0 -0
  33. {gam7-7.23.4 → gam7-7.23.6}/src/callgam.py +0 -0
  34. {gam7-7.23.4 → gam7-7.23.6}/src/gam/__main__.py +0 -0
  35. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/__init__.py +0 -0
  36. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/auth.py +0 -0
  37. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/client.py +0 -0
  38. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/core.py +0 -0
  39. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/data.py +0 -0
  40. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/http.py +0 -0
  41. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/http_core.py +0 -0
  42. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/http_interface.py +0 -0
  43. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/mock_http.py +0 -0
  44. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/mock_http_core.py +0 -0
  45. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/mock_service.py +0 -0
  46. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/service.py +0 -0
  47. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/token_store.py +0 -0
  48. {gam7-7.23.4 → gam7-7.23.6}/src/gam/atom/url.py +0 -0
  49. {gam7-7.23.4 → gam7-7.23.6}/src/gam/cacerts.pem +0 -0
  50. {gam7-7.23.4 → gam7-7.23.6}/src/gam/cbcm-v1.1beta1.json +0 -0
  51. {gam7-7.23.4 → gam7-7.23.6}/src/gam/contactdelegation-v1.json +0 -0
  52. {gam7-7.23.4 → gam7-7.23.6}/src/gam/datastudio-v1.json +0 -0
  53. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/__init__.py +0 -0
  54. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glaction.py +0 -0
  55. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glapi.py +0 -0
  56. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glcfg.py +0 -0
  57. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glentity.py +0 -0
  58. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glgapi.py +0 -0
  59. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glgdata.py +0 -0
  60. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glglobals.py +0 -0
  61. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glindent.py +0 -0
  62. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glmsgs.py +0 -0
  63. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glskus.py +0 -0
  64. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.23.4 → gam7-7.23.6}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.23.4 → gam7-7.23.6}/src/gam/meet-v2beta.json +0 -0
  80. {gam7-7.23.4 → gam7-7.23.6}/src/gam/serviceaccountlookup-v1.json +0 -0
  81. {gam7-7.23.4 → gam7-7.23.6}/src/gam-install.sh +0 -0
  82. {gam7-7.23.4 → gam7-7.23.6}/src/gam-setup.bat +0 -0
  83. {gam7-7.23.4 → gam7-7.23.6}/src/gam.exe.manifest +0 -0
  84. {gam7-7.23.4 → gam7-7.23.6}/src/gam.py +0 -0
  85. {gam7-7.23.4 → gam7-7.23.6}/src/gam.spec +0 -0
  86. {gam7-7.23.4 → gam7-7.23.6}/src/gam.wxs +0 -0
  87. {gam7-7.23.4 → gam7-7.23.6}/src/license.rtf +0 -0
  88. {gam7-7.23.4 → gam7-7.23.6}/src/tools/a_atleast_b.py +0 -0
  89. {gam7-7.23.4 → gam7-7.23.6}/src/tools/gen-wix-xml-filelist.py +0 -0
  90. {gam7-7.23.4 → gam7-7.23.6}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  91. {gam7-7.23.4 → gam7-7.23.6}/src/tools/hooks/hook-httplib2.py +0 -0
  92. {gam7-7.23.4 → gam7-7.23.6}/src/tools/mkGamRef.py +0 -0
  93. {gam7-7.23.4 → gam7-7.23.6}/src/tools/openssl.props +0 -0
  94. {gam7-7.23.4 → gam7-7.23.6}/src/tools/ssd.mjs +0 -0
  95. {gam7-7.23.4 → gam7-7.23.6}/src/version_info.txt.in +0 -0
  96. {gam7-7.23.4 → gam7-7.23.6}/wiki/00scratch.md +0 -0
  97. {gam7-7.23.4 → gam7-7.23.6}/wiki/Addresses.md +0 -0
  98. {gam7-7.23.4 → gam7-7.23.6}/wiki/Alert-Center.md +0 -0
  99. {gam7-7.23.4 → gam7-7.23.6}/wiki/Aliases.md +0 -0
  100. {gam7-7.23.4 → gam7-7.23.6}/wiki/Authorization.md +0 -0
  101. {gam7-7.23.4 → gam7-7.23.6}/wiki/BNF-Syntax.md +0 -0
  102. {gam7-7.23.4 → gam7-7.23.6}/wiki/Basic-Items.md +0 -0
  103. {gam7-7.23.4 → gam7-7.23.6}/wiki/Bulk-Processing.md +0 -0
  104. {gam7-7.23.4 → gam7-7.23.6}/wiki/Business-Account-Management.md +0 -0
  105. {gam7-7.23.4 → gam7-7.23.6}/wiki/CSV-Input-Filtering.md +0 -0
  106. {gam7-7.23.4 → gam7-7.23.6}/wiki/CSV-Output-Filtering.md +0 -0
  107. {gam7-7.23.4 → gam7-7.23.6}/wiki/CSV-Special-Characters.md +0 -0
  108. {gam7-7.23.4 → gam7-7.23.6}/wiki/Calendars-Access.md +0 -0
  109. {gam7-7.23.4 → gam7-7.23.6}/wiki/Calendars.md +0 -0
  110. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chat-Bot-Setup-Use.md +0 -0
  111. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-AUE-Counts.md +0 -0
  112. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  113. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Installed-Apps.md +0 -0
  114. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  115. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Policies.md +0 -0
  116. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Printers.md +0 -0
  117. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Profile-Management.md +0 -0
  118. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Version-Counts.md +0 -0
  119. {gam7-7.23.4 → gam7-7.23.6}/wiki/Chrome-Version-History.md +0 -0
  120. {gam7-7.23.4 → gam7-7.23.6}/wiki/ChromeOS-Devices.md +0 -0
  121. {gam7-7.23.4 → gam7-7.23.6}/wiki/Classroom-Courses.md +0 -0
  122. {gam7-7.23.4 → gam7-7.23.6}/wiki/Classroom-Guardians.md +0 -0
  123. {gam7-7.23.4 → gam7-7.23.6}/wiki/Classroom-Invitations.md +0 -0
  124. {gam7-7.23.4 → gam7-7.23.6}/wiki/Classroom-Membership.md +0 -0
  125. {gam7-7.23.4 → gam7-7.23.6}/wiki/Classroom-StudentGroups.md +0 -0
  126. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Channel.md +0 -0
  127. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Identity-Devices.md +0 -0
  128. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  129. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Identity-Groups.md +0 -0
  130. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Identity-Policies.md +0 -0
  131. {gam7-7.23.4 → gam7-7.23.6}/wiki/Cloud-Storage.md +0 -0
  132. {gam7-7.23.4 → gam7-7.23.6}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  133. {gam7-7.23.4 → gam7-7.23.6}/wiki/Collections-of-Items.md +0 -0
  134. {gam7-7.23.4 → gam7-7.23.6}/wiki/Collections-of-Users.md +0 -0
  135. {gam7-7.23.4 → gam7-7.23.6}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  136. {gam7-7.23.4 → gam7-7.23.6}/wiki/Command-Line-Parsing.md +0 -0
  137. {gam7-7.23.4 → gam7-7.23.6}/wiki/Command-Logging-Progress.md +0 -0
  138. {gam7-7.23.4 → gam7-7.23.6}/wiki/Context-Aware-Access-Levels.md +0 -0
  139. {gam7-7.23.4 → gam7-7.23.6}/wiki/Customer.md +0 -0
  140. {gam7-7.23.4 → gam7-7.23.6}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  141. {gam7-7.23.4 → gam7-7.23.6}/wiki/Domain-SharedContacts.md +0 -0
  142. {gam7-7.23.4 → gam7-7.23.6}/wiki/Domains-Verification.md +0 -0
  143. {gam7-7.23.4 → gam7-7.23.6}/wiki/Domains.md +0 -0
  144. {gam7-7.23.4 → gam7-7.23.6}/wiki/Downloads-Installs.md +0 -0
  145. {gam7-7.23.4 → gam7-7.23.6}/wiki/Drive-File-Selection.md +0 -0
  146. {gam7-7.23.4 → gam7-7.23.6}/wiki/Drive-Items.md +0 -0
  147. {gam7-7.23.4 → gam7-7.23.6}/wiki/Drive-REST-API-v3.md +0 -0
  148. {gam7-7.23.4 → gam7-7.23.6}/wiki/Email-Audit-Monitor.md +0 -0
  149. {gam7-7.23.4 → gam7-7.23.6}/wiki/Find-File-Owner.md +0 -0
  150. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM-Public-Chat-Room.md +0 -0
  151. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM-Release-Process.md +0 -0
  152. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM-Return-Codes.md +0 -0
  153. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  154. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM7-FAQ.md +0 -0
  155. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM7-on-Android-Devices.md +0 -0
  156. {gam7-7.23.4 → gam7-7.23.6}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  157. {gam7-7.23.4 → gam7-7.23.6}/wiki/Global-Address-List.md +0 -0
  158. {gam7-7.23.4 → gam7-7.23.6}/wiki/Google-Data-Transfers.md +0 -0
  159. {gam7-7.23.4 → gam7-7.23.6}/wiki/Google-Network-Addresses.md +0 -0
  160. {gam7-7.23.4 → gam7-7.23.6}/wiki/Groups-Membership.md +0 -0
  161. {gam7-7.23.4 → gam7-7.23.6}/wiki/Groups.md +0 -0
  162. {gam7-7.23.4 → gam7-7.23.6}/wiki/HTTPS-Proxy.md +0 -0
  163. {gam7-7.23.4 → gam7-7.23.6}/wiki/Home.md +0 -0
  164. {gam7-7.23.4 → gam7-7.23.6}/wiki/How-to-Install-GAM7.md +0 -0
  165. {gam7-7.23.4 → gam7-7.23.6}/wiki/How-to-Uninstall-GAM7.md +0 -0
  166. {gam7-7.23.4 → gam7-7.23.6}/wiki/How-to-Update-GAM7.md +0 -0
  167. {gam7-7.23.4 → gam7-7.23.6}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  168. {gam7-7.23.4 → gam7-7.23.6}/wiki/Inbound-SSO.md +0 -0
  169. {gam7-7.23.4 → gam7-7.23.6}/wiki/Install-GAM-as-Python-Library.md +0 -0
  170. {gam7-7.23.4 → gam7-7.23.6}/wiki/Licenses.md +0 -0
  171. {gam7-7.23.4 → gam7-7.23.6}/wiki/List-Items.md +0 -0
  172. {gam7-7.23.4 → gam7-7.23.6}/wiki/List.md +0 -0
  173. {gam7-7.23.4 → gam7-7.23.6}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  174. {gam7-7.23.4 → gam7-7.23.6}/wiki/Mobile-Devices.md +0 -0
  175. {gam7-7.23.4 → gam7-7.23.6}/wiki/Organizational-Units.md +0 -0
  176. {gam7-7.23.4 → gam7-7.23.6}/wiki/Other-Resources.md +0 -0
  177. {gam7-7.23.4 → gam7-7.23.6}/wiki/Permission-Matches.md +0 -0
  178. {gam7-7.23.4 → gam7-7.23.6}/wiki/Python-Regular-Expressions.md +0 -0
  179. {gam7-7.23.4 → gam7-7.23.6}/wiki/README.md +0 -0
  180. {gam7-7.23.4 → gam7-7.23.6}/wiki/Rclone.md +0 -0
  181. {gam7-7.23.4 → gam7-7.23.6}/wiki/Reports.md +0 -0
  182. {gam7-7.23.4 → gam7-7.23.6}/wiki/Reseller.md +0 -0
  183. {gam7-7.23.4 → gam7-7.23.6}/wiki/Resources.md +0 -0
  184. {gam7-7.23.4 → gam7-7.23.6}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  185. {gam7-7.23.4 → gam7-7.23.6}/wiki/SSL-Root-CA-Certificates.md +0 -0
  186. {gam7-7.23.4 → gam7-7.23.6}/wiki/Schemas.md +0 -0
  187. {gam7-7.23.4 → gam7-7.23.6}/wiki/Scripts.md +0 -0
  188. {gam7-7.23.4 → gam7-7.23.6}/wiki/Send-Email.md +0 -0
  189. {gam7-7.23.4 → gam7-7.23.6}/wiki/Shared-Drives.md +0 -0
  190. {gam7-7.23.4 → gam7-7.23.6}/wiki/Sites.md +0 -0
  191. {gam7-7.23.4 → gam7-7.23.6}/wiki/Tag-Replace.md +0 -0
  192. {gam7-7.23.4 → gam7-7.23.6}/wiki/Todrive.md +0 -0
  193. {gam7-7.23.4 → gam7-7.23.6}/wiki/Unmanaged-Accounts.md +0 -0
  194. {gam7-7.23.4 → gam7-7.23.6}/wiki/Upgrade-Benefits.md +0 -0
  195. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Analytics-Admin.md +0 -0
  196. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Application-Specific-Passwords.md +0 -0
  197. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Backup-Verification-Codes.md +0 -0
  198. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Calendars-Access.md +0 -0
  199. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Calendars.md +0 -0
  200. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Chat.md +0 -0
  201. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Classification-Labels.md +0 -0
  202. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Classroom-Profile.md +0 -0
  203. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Contacts-Delegates.md +0 -0
  204. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Contacts.md +0 -0
  205. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Deprovision.md +0 -0
  206. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Activity-Settings.md +0 -0
  207. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Cleanup.md +0 -0
  208. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Comments.md +0 -0
  209. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Copy-Move.md +0 -0
  210. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Files-Display.md +0 -0
  211. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Files-Manage.md +0 -0
  212. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Orphans.md +0 -0
  213. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Ownership.md +0 -0
  214. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Permissions.md +0 -0
  215. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Query.md +0 -0
  216. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Revisions.md +0 -0
  217. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Shortcuts.md +0 -0
  218. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Drive-Transfer.md +0 -0
  219. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Forms.md +0 -0
  220. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-CSE.md +0 -0
  221. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Delegates.md +0 -0
  222. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Filters.md +0 -0
  223. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Forwarding.md +0 -0
  224. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Labels.md +0 -0
  225. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  226. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Profile.md +0 -0
  227. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-S-MIME.md +0 -0
  228. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  229. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Gmail-Settings.md +0 -0
  230. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Group-Membership.md +0 -0
  231. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Keep-Notes.md +0 -0
  232. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Looker-Studio.md +0 -0
  233. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Meet.md +0 -0
  234. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Photo.md +0 -0
  235. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Profile-Photo.md +0 -0
  236. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Profile-Sharing.md +0 -0
  237. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Shared-Drives.md +0 -0
  238. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  239. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Spreadsheets.md +0 -0
  240. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Tag-Manager.md +0 -0
  241. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Tokens.md +0 -0
  242. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  243. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users-YouTube.md +0 -0
  244. {gam7-7.23.4 → gam7-7.23.6}/wiki/Users.md +0 -0
  245. {gam7-7.23.4 → gam7-7.23.6}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  246. {gam7-7.23.4 → gam7-7.23.6}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  247. {gam7-7.23.4 → gam7-7.23.6}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  248. {gam7-7.23.4 → gam7-7.23.6}/wiki/Vault-Takeout.md +0 -0
  249. {gam7-7.23.4 → gam7-7.23.6}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  250. {gam7-7.23.4 → gam7-7.23.6}/wiki/_Sidebar.md +0 -0
  251. {gam7-7.23.4 → gam7-7.23.6}/wiki/gam.cfg.md +0 -0
  252. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Android-Installation.md +0 -0
  254. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-BulkOperations.md +0 -0
  255. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-CalendarExamples.md +0 -0
  256. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Chat-Bot.md +0 -0
  257. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Custom-Schemas.md +0 -0
  273. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Data-Transfers.md +0 -0
  274. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-DomainVerification.md +0 -0
  275. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-ExamplesCSV.md +0 -0
  277. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM-options-files.md +0 -0
  282. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Home.md +0 -0
  290. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-LicenseExamples.md +0 -0
  293. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Managing-Admins.md +0 -0
  294. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Managing-Devices.md +0 -0
  296. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Printers.md +0 -0
  299. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-ResellerCommands.md +0 -0
  300. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-SecurityExamples.md +0 -0
  301. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.23.4 → gam7-7.23.6}/wiki/legacy/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.23.4 → gam7-7.23.6}/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 }}-20251001
161
+ key: gam-${{ matrix.jid }}-20251002
162
162
 
163
163
  - name: Untar Cache archive
164
164
  if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
@@ -168,7 +168,7 @@ jobs:
168
168
 
169
169
  - name: Use pre-compiled Python for testing
170
170
  if: matrix.python != ''
171
- uses: actions/setup-python@3d1e2d2ca0a067f27da6fec484fce7f5256def85 # v5.6.0
171
+ uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
172
172
  with:
173
173
  python-version: ${{ matrix.python }}
174
174
  allow-prereleases: true
@@ -1027,7 +1027,8 @@ jobs:
1027
1027
  else
1028
1028
  tar_folders="bin/"
1029
1029
  fi
1030
- tar cJvvf cache.tar.xz $tar_folders
1030
+ echo '.git*' > ./excludes.txt
1031
+ tar cJvvf cache.tar.xz --exclude-from=excludes.txt $tar_folders
1031
1032
 
1032
1033
  merge:
1033
1034
  if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
@@ -1077,7 +1078,7 @@ jobs:
1077
1078
  echo "dateversion=${dateversion}" >> $GITHUB_OUTPUT
1078
1079
 
1079
1080
  - name: Publish draft release
1080
- uses: softprops/action-gh-release@fbadcc90e88ecface60a0a0d123795b784ceb239 # v2.3.2
1081
+ uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836 # v2.3.3
1081
1082
  with:
1082
1083
  draft: true
1083
1084
  prerelease: false
@@ -30,6 +30,6 @@ jobs:
30
30
  python -m build
31
31
 
32
32
  - name: Publish package distributions to PyPI
33
- uses: pypa/gh-action-pypi-publish@release/v1
33
+ uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
34
34
  with:
35
35
  attestation: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.23.4
3
+ Version: 7.23.6
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
@@ -368,6 +368,7 @@ If an item contains spaces, it should be surrounded by ".
368
368
  ## Named items
369
369
 
370
370
  <AccessToken> ::= <String>
371
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
371
372
  <AlertID> ::= <String>
372
373
  <APIScopeURL> ::= <String>
373
374
  <APPID> ::= <String>
@@ -691,6 +692,7 @@ If an item contains spaces, it should be surrounded by ".
691
692
 
692
693
  ## Lists of basic items
693
694
 
695
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
694
696
  <APIScopeURLList> ::= "<APIScopeURL>(,<APIScopeURL>)*"
695
697
  <ASPIDList> ::= "<ASPID>(,<ASPID>)*"
696
698
  <AssetTagList> ::= "<AssetTag>(,<AssetTag>)*"
@@ -1552,10 +1554,13 @@ gam create|add admin <EmailAddress>|<UniqueID> <RoleItem> customer|(org_unit <Or
1552
1554
  gam delete admin <RoleAssignmentId>
1553
1555
 
1554
1556
  gam print admins [todrive <ToDriveAttribute>*]
1555
- [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition]
1556
- [privileges] [oneitemperrow]
1557
+ [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1558
+ [types <AdminAssigneeTypeList>]
1559
+ [recursive] [condition] [privileges] [oneitemperrow]
1557
1560
  gam show admins
1558
- [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition] [privileges]
1561
+ [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1562
+ [types <AdminAssigneeTypeList>]
1563
+ [recursive] [condition] [privileges]
1559
1564
 
1560
1565
  # Alert Center
1561
1566
 
@@ -1,3 +1,17 @@
1
+ 7.23.06
2
+
3
+ Added option `types <AdminAssigneeTypeList>` to `gam print|show admins` that allows filtering
4
+ of admin assignments by the type of the assignee; by default, all assignee types are displayed.
5
+ ```
6
+ <AdminAssigneeType> ::= group|user|serviceaccount|unknown
7
+ <AdminAssigneeTypeList> ::= "<AdminAssigneeType>(,<AdminAssigneeType>)*"
8
+ ```
9
+
10
+ 7.23.05
11
+
12
+ Added option `recursive` that will display assignments to the members
13
+ of security groups assigned to roles; the security group membership is recursively expanded.
14
+
1
15
  7.23.04
2
16
 
3
17
  Added option `addcsvdata <FieldName> <String>` to `gam <UserTypeEntity> print events`
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.23.04'
28
+ __version__ = '7.23.06'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -16990,21 +16990,38 @@ def doDeleteAdmin():
16990
16990
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
16991
16991
  ClientAPIAccessDeniedExit(str(e))
16992
16992
 
16993
- ASSIGNEE_EMAILTYPE_TOFIELD_MAP = {
16993
+ ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP = {
16994
16994
  'user': 'assignedToUser',
16995
16995
  'group': 'assignedToGroup',
16996
16996
  'serviceaccount': 'assignedToServiceAccount',
16997
+ 'unknown': 'assignedToUnknown',
16997
16998
  }
16998
- PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId']
16999
+ ALL_ASSIGNEE_TYPES = ['user', 'group', 'serviceaccount']
17000
+
17001
+ PRINT_ADMIN_FIELDS = ['roleAssignmentId', 'roleId', 'assignedTo', 'scopeType', 'orgUnitId', 'assigneeType']
16999
17002
  PRINT_ADMIN_TITLES = ['roleAssignmentId', 'roleId', 'role',
17000
17003
  'assignedTo', 'assignedToUser', 'assignedToGroup', 'assignedToServiceAccount', 'assignedToUnknown',
17001
17004
  'scopeType', 'orgUnitId', 'orgUnit']
17002
17005
 
17006
+ def getAssigneeTypes(myarg, typesSet):
17007
+ if myarg in {'type', 'types'}:
17008
+ for gtype in getString(Cmd.OB_ADMIN_ASSIGNEE_TYPE_LIST).lower().replace(',', ' ').split():
17009
+ if gtype in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17010
+ typesSet.add(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[gtype])
17011
+ else:
17012
+ invalidChoiceExit(gtype, ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP, True)
17013
+ else:
17014
+ return False
17015
+ return True
17016
+
17003
17017
  # gam print admins [todrive <ToDriveAttribute>*]
17004
- # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition]
17005
- # [privileges] [oneitemperrow]
17018
+ # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
17019
+ # [types <AdminAssigneeTypeList>]
17020
+ # [recursive] [condition] [privileges] [oneitemperrow]
17006
17021
  # gam show admins
17007
- # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition] [privileges]
17022
+ # [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
17023
+ # [types <AdminAssigneeTypeList>]
17024
+ # [recursive] [condition] [privileges]
17008
17025
  def doPrintShowAdmins():
17009
17026
  def _getPrivileges(admin):
17010
17027
  if showPrivileges:
@@ -17031,19 +17048,18 @@ def doPrintShowAdmins():
17031
17048
  def _setNamesFromIds(admin, privileges):
17032
17049
  admin['role'] = role_from_roleid(admin['roleId'])
17033
17050
  assignedTo = admin['assignedTo']
17034
- admin['assignedToUnknown'] = False
17035
17051
  if assignedTo not in assignedToIdEmailMap:
17036
- assigneeType = admin.get('assigneeType')
17037
- assignedToField = ASSIGNEE_EMAILTYPE_TOFIELD_MAP.get(assigneeType, None)
17038
17052
  assigneeEmail, assigneeType = convertUIDtoEmailAddressWithType(f'uid:{assignedTo}', cd, sal,
17039
- emailTypes=list(ASSIGNEE_EMAILTYPE_TOFIELD_MAP.keys()))
17040
- if not assignedToField and assigneeType in ASSIGNEE_EMAILTYPE_TOFIELD_MAP:
17041
- assignedToField = ASSIGNEE_EMAILTYPE_TOFIELD_MAP[assigneeType]
17042
- if assigneeType == 'unknown':
17053
+ emailTypes=ALL_ASSIGNEE_TYPES if admin.get('assigneeType') != 'group' else ['group'])
17054
+ if assigneeType in ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP:
17055
+ assignedToField = ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP[assigneeType]
17056
+ else:
17043
17057
  assignedToField = 'assignedToUnknown'
17058
+ if assignedToField == 'assignedToUnknown':
17044
17059
  assigneeEmail = True
17045
17060
  assignedToIdEmailMap[assignedTo] = {'assignedToField': assignedToField, 'assigneeEmail': assigneeEmail}
17046
17061
  admin[assignedToIdEmailMap[assignedTo]['assignedToField']] = assignedToIdEmailMap[assignedTo]['assigneeEmail']
17062
+ admin['assignedToField'] = assignedToIdEmailMap[assignedTo]['assignedToField']
17047
17063
  if privileges is not None:
17048
17064
  admin.update(privileges)
17049
17065
  if 'orgUnitId' in admin:
@@ -17059,7 +17075,8 @@ def doPrintShowAdmins():
17059
17075
  csvPF = CSVPrintFile(PRINT_ADMIN_TITLES) if Act.csvFormat() else None
17060
17076
  roleId = None
17061
17077
  userKey = None
17062
- oneItemPerRow = showPrivileges = False
17078
+ oneItemPerRow = recursive = showPrivileges = False
17079
+ typesSet = set()
17063
17080
  kwargs = {}
17064
17081
  rolePrivileges = {}
17065
17082
  fieldsList = PRINT_ADMIN_FIELDS
@@ -17072,6 +17089,17 @@ def doPrintShowAdmins():
17072
17089
  userKey = kwargs['userKey'] = getEmailAddress()
17073
17090
  elif myarg == 'role':
17074
17091
  _, roleId = getRoleId()
17092
+ elif getAssigneeTypes(myarg, typesSet):
17093
+ pass
17094
+ elif myarg == 'recursive':
17095
+ recursive = True
17096
+ allGroupRoles = ','.join(sorted(ALL_GROUP_ROLES))
17097
+ memberOptions = initMemberOptions()
17098
+ memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP] = True
17099
+ memberOptions[MEMBEROPTION_DISPLAYMATCH] = False
17100
+ memberDisplayOptions = initIPSGMGroupMemberDisplayOptions()
17101
+ for role in [Ent.ROLE_MEMBER, Ent.ROLE_MANAGER, Ent.ROLE_OWNER]:
17102
+ memberDisplayOptions[role]['show'] = True
17075
17103
  elif myarg == 'condition':
17076
17104
  fieldsList.append('condition')
17077
17105
  if csvPF:
@@ -17085,13 +17113,15 @@ def doPrintShowAdmins():
17085
17113
  if roleId and not kwargs:
17086
17114
  kwargs['roleId'] = roleId
17087
17115
  roleId = None
17116
+ if not typesSet:
17117
+ typesSet = set(ADMIN_ASSIGNEE_TYPE_TO_ASSIGNEDTO_FIELD_MAP.values())
17088
17118
  fields = getItemFieldsFromFieldsList('items', fieldsList)
17089
17119
  printGettingAllAccountEntities(Ent.ADMIN_ROLE_ASSIGNMENT)
17090
17120
  try:
17091
17121
  admins = callGAPIpages(cd.roleAssignments(), 'list', 'items',
17092
17122
  pageMessage=getPageMessage(),
17093
17123
  throwReasons=[GAPI.INVALID, GAPI.USER_NOT_FOUND,
17094
- GAPI.FORBIDDEN, GAPI.SERVICE_NOT_AVAILABLE,
17124
+ GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.SERVICE_NOT_AVAILABLE,
17095
17125
  GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND,
17096
17126
  GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
17097
17127
  retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
@@ -17099,39 +17129,77 @@ def doPrintShowAdmins():
17099
17129
  except (GAPI.invalid, GAPI.userNotFound):
17100
17130
  entityUnknownWarning(Ent.ADMINISTRATOR, userKey)
17101
17131
  return
17102
- except (GAPI.serviceNotAvailable) as e:
17103
- entityActionFailedExit([Ent.ADMINISTRATOR, userKey, Ent.ADMIN_ROLE, roleId], str(e))
17132
+ except GAPI.notFound as e:
17133
+ entityActionFailedExit([Ent.ADMIN_ROLE, kwargs['roleId']], str(e))
17134
+ except (GAPI.forbidden, GAPI.serviceNotAvailable) as e:
17135
+ entityActionFailedExit([Ent.ADMINISTRATOR, userKey], str(e))
17104
17136
  except (GAPI.badRequest, GAPI.customerNotFound):
17105
17137
  accessErrorExit(cd)
17106
17138
  except (GAPI.forbidden, GAPI.permissionDenied) as e:
17107
17139
  ClientAPIAccessDeniedExit(str(e))
17140
+ count = len(admins)
17141
+ groupMembers = {}
17142
+ expandedAdmins = []
17143
+ i = 0
17144
+ for admin in admins:
17145
+ i += 1
17146
+ if roleId and roleId != admin['roleId']:
17147
+ continue
17148
+ assignedTo = admin['assignedTo']
17149
+ if admin['assigneeType'] != 'group' or not recursive:
17150
+ _setNamesFromIds(admin, _getPrivileges(admin))
17151
+ if admin['assignedToField'] in typesSet:
17152
+ expandedAdmins.append(admin)
17153
+ continue
17154
+ if assignedTo not in groupMembers:
17155
+ membersList = []
17156
+ membersSet = set()
17157
+ level = 0
17158
+ getGroupMembers(cd, assignedTo, allGroupRoles, membersList, membersSet, i, count,
17159
+ memberOptions, memberDisplayOptions, level, {Ent.TYPE_USER})
17160
+ groupMembers[assignedTo] = membersList[:]
17161
+ _setNamesFromIds(admin, _getPrivileges(admin))
17162
+ if admin[assignedToIdEmailMap[assignedTo]['assignedToField']] not in typesSet:
17163
+ continue
17164
+ expandedAdmins.append(admin)
17165
+ if not groupMembers[assignedTo]:
17166
+ expandedAdmins.append(admin)
17167
+ continue
17168
+ admin['assigneeType'] = 'user'
17169
+ admin['assignedToGroup'] = assignedToIdEmailMap[assignedTo]['assigneeEmail']
17170
+ for member in groupMembers[assignedTo]:
17171
+ userAdmin = admin.copy()
17172
+ userAdmin['assignedTo'] = member['id']
17173
+ _setNamesFromIds(userAdmin, _getPrivileges(admin))
17174
+ expandedAdmins.append(userAdmin)
17175
+ admins = expandedAdmins
17176
+ count = len(expandedAdmins)
17108
17177
  if not csvPF:
17109
- count = len(admins)
17110
17178
  performActionNumItems(count, Ent.ADMIN_ROLE_ASSIGNMENT)
17111
17179
  Ind.Increment()
17112
17180
  i = 0
17113
- for admin in admins:
17181
+ for admin in expandedAdmins:
17114
17182
  i += 1
17115
- if roleId and roleId != admin['roleId']:
17116
- continue
17117
- _setNamesFromIds(admin, _getPrivileges(admin))
17118
17183
  printEntity([Ent.ADMIN_ROLE_ASSIGNMENT, admin['roleAssignmentId']], i, count)
17119
17184
  Ind.Increment()
17120
17185
  for field in PRINT_ADMIN_TITLES:
17121
17186
  if field in admin:
17122
17187
  if field == 'roleAssignmentId':
17123
17188
  continue
17124
- if field != 'rolePrivileges':
17125
- printKeyValueList([field, admin[field]])
17126
- else:
17127
- showJSON(None, admin[field])
17189
+ printKeyValueList([field, admin[field]])
17190
+ if showPrivileges:
17191
+ rolePrivileges = admin.get('rolePrivileges', [])
17192
+ jcount = len(rolePrivileges)
17193
+ if jcount > 0:
17194
+ printKeyValueList(['rolePrivileges', jcount])
17195
+ Ind.Increment()
17196
+ showJSON(None, rolePrivileges)
17197
+ Ind.Decrement()
17128
17198
  Ind.Decrement()
17129
17199
  Ind.Decrement()
17130
17200
  else:
17131
- for admin in admins:
17132
- if roleId and roleId != admin['roleId']:
17133
- continue
17134
- _setNamesFromIds(admin, _getPrivileges(admin))
17201
+ for admin in expandedAdmins:
17202
+ admin.pop('assignedToField')
17135
17203
  if not oneItemPerRow or 'rolePrivileges' not in admin:
17136
17204
  csvPF.WriteRowTitles(flattenJSON(admin))
17137
17205
  else:
@@ -1138,6 +1138,7 @@ class GamCLArgs():
1138
1138
  OB_ARGUMENT = 'argument'
1139
1139
  OB_ASP_ID_LIST = 'ASPIDList'
1140
1140
  OB_ASSET_ID = 'AssetID'
1141
+ OB_ADMIN_ASSIGNEE_TYPE_LIST = 'AdminAssigneeTypeList'
1141
1142
  OB_BROWSER_ENROLLEMNT_TOKEN_ID = 'BrowserEnrollmentTokenID'
1142
1143
  OB_BROWSER_ENTITY = 'BrowserEntity'
1143
1144
  OB_BUILDING_ID = 'BuildingID'
@@ -1475,16 +1475,20 @@ gam delete admin <RoleAssignmentId>
1475
1475
  ## Display administrators
1476
1476
  ```
1477
1477
  gam print admins [todrive <ToDriveAttribute>*]
1478
- [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition]
1479
- [privileges] [oneitemperrow]
1478
+ [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1479
+ [recursive] [condition] [privileges] [oneitemperrow]
1480
1480
  gam show admins
1481
- [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition] [privileges]
1481
+ [user|group <EmailAddress>|<UniqueID>] [role <RoleItem>]
1482
+ [recursive] [condition] [privileges]
1482
1483
  ```
1483
1484
  By default, all administrators and roles are displayed; choose from the following
1484
1485
  options to limit the display:
1485
- * `user <UserItem>` - Display only this administrator
1486
+ * `user|group <EmailAddress>|<UniqueID>` - Display assignments to this administrator
1486
1487
  * `role <RoleItem>` - Display only administrators with this role
1487
1488
 
1489
+ By default, assignments to security groups are shown as a single item; use `recursive`
1490
+ to display assignments to the members of the security groups; the security group membershop is recursively expanded.
1491
+
1488
1492
  * `condition` - Display any conditions associated with a role assignment
1489
1493
  * `privileges` - Display privileges associated with each role assignment
1490
1494
 
@@ -567,7 +567,7 @@ By default, Gam displays the information as an indented list of keys and values.
567
567
  ```
568
568
  gam calendar <CalendarEntity> show events [<EventEntity>] <EventDisplayProperty>*
569
569
  [fields <EventFieldNameList>] [showdayofweek]
570
- [countsly] [formatjson]
570
+ [countsly|formatjson]
571
571
  ```
572
572
  In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
573
573
 
@@ -586,8 +586,9 @@ By default, Gam displays event details, use `countsonly` to display only the num
586
586
  ```
587
587
  gam calendar <CalendarEntity> print events [<EventEntity>] <EventDisplayProperty>*
588
588
  [fields <EventFieldNameList>] [showdayofweek]
589
- [countsonly [eventrowfilter]]
590
- [formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
589
+ (addcsvdata <FieldName> <String>)*
590
+ [eventrowfilter]
591
+ [countsonly|(formatjson [quotechar <Character>])] [todrive <ToDriveAttribute>*]
591
592
  ```
592
593
  In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
593
594
 
@@ -598,6 +599,9 @@ option `singleevents` to display all instances of a recurring event.
598
599
 
599
600
  `showdayofweek` displays columns `start.dayOfWeek` and `end.dayOfWeek` when event start and end times are displayed.
600
601
 
602
+ Add additional columns of data from the command line to the output after the calendarId.
603
+ * `addcsvdata <FieldName> <String>`
604
+
601
605
  By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
602
606
  * `formatjson` - Display the fields in JSON format.
603
607
 
@@ -10,6 +10,23 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
10
10
 
11
11
  See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
12
12
 
13
+ ### 7.23.05
14
+
15
+ Added option `recursive` to `gam print|show admins` that will display assignments to the members
16
+ of security groups assigned to roles; the security group membership is recursively expanded.
17
+
18
+ ### 7.23.04
19
+
20
+ Added option `addcsvdata <FieldName> <String>` to `gam <UserTypeEntity> print events`
21
+ and `gam calendars <CalendarEntity> print events` that adds additional columns of data to the CSV file output.
22
+ An example would be to get the calendar name in addition to the calendar ID when printing events.
23
+ ```
24
+ gam redirect csv ./Resources.csv print resources fields email,name
25
+ gam redirect csv ./ResourceEventCounts.csv multiprocess redirect stderr - multiprocess csv Resources.csv gam calendar "~resourceEmail" print events starttime -1y countsonly addcsvdata calendarName "~resourceName"
26
+ ```
27
+
28
+ Upgraded to OpenSSL 3.6.0.
29
+
13
30
  ### 7.23.03
14
31
 
15
32
  Upgraded to OpenSSL 3.5.4.
@@ -252,7 +252,7 @@ writes the credentials into the file oauth2.txt.
252
252
  admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
253
253
  admin@server:/Users/admin$ gam version
254
254
  WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
255
- GAM 7.23.03 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
256
256
  GAM Team <google-apps-manager@googlegroups.com>
257
257
  Python 3.13.7 64-bit final
258
258
  macOS Tahoe 26.0.1 x86_64
@@ -653,7 +653,7 @@ By default, Gam displays the information as an indented list of keys and values.
653
653
  ```
654
654
  gam <UserTypeEntity> show events <UserCalendarEntity> [<EventEntity>] <EventDisplayProperty>*
655
655
  [fields <EventFieldNameList>] [showdayofweek]
656
- [countsonly] [formatjson]
656
+ [countsonly|formatjson]
657
657
  ```
658
658
  In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
659
659
 
@@ -672,8 +672,8 @@ By default, Gam displays event details, use `countsonly` to display only the num
672
672
  ```
673
673
  gam <UserTypeEntity> print events <UserCalendarEntity> [<EventEntity>] <EventDisplayProperty>*
674
674
  [fields <EventFieldNameList>] [showdayofweek]
675
- [countsonly]
676
- [formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
675
+ (addcsvdata <FieldName> <String>)*
676
+ [eventrowfilter] [countsonly|(formatjson [quotechar <Character>])] [todrive <ToDriveAttribute>*]
677
677
  ```
678
678
  In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
679
679
 
@@ -684,6 +684,9 @@ option `singleevents` to display all instances of a recurring event.
684
684
 
685
685
  `showdayofweek` displays columns `start.dayOfWeek` and `end.dayOfWeek` when event start and end times are displayed.
686
686
 
687
+ Add additional columns of data from the command line to the output after the calendarId.
688
+ * `addcsvdata <FieldName> <String>`
689
+
687
690
  By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
688
691
  * `formatjson` - Display the fields in JSON format.
689
692
 
@@ -398,8 +398,8 @@ By default, Gam displays the information as an indented list of keys and values.
398
398
  gam <UserTypeEntity> show contacts
399
399
  <PeoplePrintShowUserContactSelection>
400
400
  [orderby firstname|lastname|(lastmodified ascending)|(lastnodified descending)
401
- [countsonly|allfields|(fields <PeopleFieldNameList>)] [showgroups] [showmetadata]
402
- [formatjson]
401
+ [allfields|(fields <PeopleFieldNameList>)] [showgroups] [showmetadata]
402
+ [countsonly|formatjson]
403
403
  ```
404
404
  By default, Gam displays all of a user's people contacts.
405
405
  * `query <String>` - Display contacts based on the data in their fields
@@ -416,8 +416,8 @@ By default, Gam displays the information as an indented list of keys and values.
416
416
  gam <UserTypeEntity> print contacts [todrive <ToDriveAttribute>*]
417
417
  <PeoplePrintShowUserContactSelection>
418
418
  [orderby firstname|lastname|(lastmodified ascending)|(lastnodified descending)
419
- [countsonly|allfields|(fields <PeopleFieldNameList>)] [showgroups] [showmetadata]
420
- [formatjson [quotechar <Character>]]
419
+ [allfields|(fields <PeopleFieldNameList>)] [showgroups] [showmetadata]
420
+ [countsonly|(formatjson [quotechar <Character>])]
421
421
  ```
422
422
  By default, Gam displays all of a user's people contacts.
423
423
  * `query <String>` - Display contacts based on the data in their fields
@@ -547,8 +547,8 @@ User: user@domain.com, Delete maximum of 15 Other Contacts
547
547
  ```
548
548
  gam <UserTypeEntity> show othercontacts
549
549
  [<OtherContactsSelection>]
550
- [countsonly|allfields|(fields <OtherContactsFieldNameList>)] [showmetadata]
551
- [formatjson]
550
+ [allfields|(fields <OtherContactsFieldNameList>)] [showmetadata]
551
+ [countsonly|formatjson]
552
552
  ```
553
553
  By default, Gam displays all of a user's Other Contacts; use
554
554
  `<OtherContactsSelection>` to display a selection of Other Contacts.
@@ -563,8 +563,8 @@ By default, Gam displays the information as an indented list of keys and values.
563
563
  ```
564
564
  gam <UserTypeEntity> print othercontacts [todrive <ToDriveAttribute>*]
565
565
  [<OtherContactsSelection>]
566
- [countsonly|allfields|(fields <OtherContactsFieldNameList>)] [showmetadata]
567
- [formatjson [quotechar <Character>]]
566
+ [allfields|(fields <OtherContactsFieldNameList>)] [showmetadata]
567
+ [countsonly|(formatjson [quotechar <Character>])]
568
568
  ```
569
569
  By default, Gam displays all of a user's Other Contacts; use
570
570
  `<OtherContactsSelection>` to display a selection of Other Contacts.
@@ -122,7 +122,7 @@ gam <UserTypeEntity> show tasks [tasklists <TasklistEntity>]
122
122
  [updatedmin <Time>]
123
123
  [showcompleted [<Boolean>]] [showdeleted [<Boolean>]] [showhidden [<Boolean>]] [showall]
124
124
  [orderby completed|due|updated]
125
- [countsonly|compact|formatjson]
125
+ [compact|countsonly|formatjson]
126
126
  ```
127
127
  The API only supports dates in `duemin` and `duemax' but you must supply a null time:
128
128
  * `duemin YYYY-MM-DDT00:00:00Z` - Specify the starting due date
@@ -152,7 +152,7 @@ gam <UserTypeEntity> print tasks [tasklists <TasklistEntity>] [todrive <ToDriveA
152
152
  [updatedmin <Time>]
153
153
  [showcompleted [<Boolean>]] [showdeleted [<Boolean>]] [showhidden [<Boolean>]] [showall]
154
154
  [orderby completed|due|updated]
155
- [countsonly | (formatjson [quotechar <Character>])]
155
+ [countsonly|(formatjson [quotechar <Character>])]
156
156
  ```
157
157
  The API only supports dates in `duemin` and `duemax' but you must supply a null time:
158
158
  * `duemin YYYY-MM-DDT00:00:00Z` - Specify the starting due date
@@ -230,7 +230,7 @@ By default, Gam displays the task lists as an indented list of keys and values.
230
230
 
231
231
  ```
232
232
  gam <UserTypeEntity> print tasklists [todrive <ToDriveAttribute>*]
233
- [countsonly | (formatjson [quotechar <Character>])]
233
+ [countsonly|(formatjson [quotechar <Character>])]
234
234
  ```
235
235
  By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
236
236
  * `formatjson` - Display the fields in JSON format.
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.23.03 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
8
  Python 3.13.7 64-bit final
9
9
  macOS Tahoe 26.0.1 x86_64
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
15
15
  Print the current version of Gam with details and time offset information
16
16
  ```
17
17
  gam version timeoffset
18
- GAM 7.23.03 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
20
  Python 3.13.7 64-bit final
21
21
  macOS Tahoe 26.0.1 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
27
27
  Print the current version of Gam with extended details and SSL information
28
28
  ```
29
29
  gam version extended
30
- GAM 7.23.03 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.23.05 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
32
  Python 3.13.7 64-bit final
33
33
  macOS Tahoe 26.0.1 x86_64
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes