gam7 7.6.12__tar.gz → 7.6.14__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 (319) hide show
  1. {gam7-7.6.12 → gam7-7.6.14}/PKG-INFO +1 -1
  2. {gam7-7.6.12 → gam7-7.6.14}/src/GamCommands.txt +9 -4
  3. {gam7-7.6.12 → gam7-7.6.14}/src/GamUpdate.txt +13 -0
  4. {gam7-7.6.12 → gam7-7.6.14}/src/gam/__init__.py +139 -77
  5. gam7-7.6.14/wiki/Administrators.md +1451 -0
  6. {gam7-7.6.12 → gam7-7.6.14}/wiki/GamUpdates.md +5 -0
  7. {gam7-7.6.12 → gam7-7.6.14}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  8. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Copy-Move.md +13 -0
  9. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Files-Display.md +6 -1
  10. {gam7-7.6.12 → gam7-7.6.14}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +1 -1
  11. {gam7-7.6.12 → gam7-7.6.14}/wiki/Version-and-Help.md +6 -6
  12. gam7-7.6.12/wiki/Administrators.md +0 -907
  13. {gam7-7.6.12 → gam7-7.6.14}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  14. {gam7-7.6.12 → gam7-7.6.14}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  15. {gam7-7.6.12 → gam7-7.6.14}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  16. {gam7-7.6.12 → gam7-7.6.14}/.github/ISSUE_TEMPLATE.txt +0 -0
  17. {gam7-7.6.12 → gam7-7.6.14}/.github/actions/decrypt.sh +0 -0
  18. {gam7-7.6.12 → gam7-7.6.14}/.github/actions/entitlements.plist +0 -0
  19. {gam7-7.6.12 → gam7-7.6.14}/.github/actions/package_exclusions.txt +0 -0
  20. {gam7-7.6.12 → gam7-7.6.14}/.github/stale.yml +0 -0
  21. {gam7-7.6.12 → gam7-7.6.14}/.github/workflows/build.yml +0 -0
  22. {gam7-7.6.12 → gam7-7.6.14}/.github/workflows/codeql-analysis.yml +0 -0
  23. {gam7-7.6.12 → gam7-7.6.14}/.github/workflows/get-cacerts.yml +0 -0
  24. {gam7-7.6.12 → gam7-7.6.14}/.github/workflows/pushwiki.yml +0 -0
  25. {gam7-7.6.12 → gam7-7.6.14}/.github/workflows/pypi.yml +0 -0
  26. {gam7-7.6.12 → gam7-7.6.14}/.pre-commit-config.yaml +0 -0
  27. {gam7-7.6.12 → gam7-7.6.14}/LICENSE +0 -0
  28. {gam7-7.6.12 → gam7-7.6.14}/README.md +0 -0
  29. {gam7-7.6.12 → gam7-7.6.14}/pyproject.toml +0 -0
  30. {gam7-7.6.12 → gam7-7.6.14}/src/.gitignore +0 -0
  31. {gam7-7.6.12 → gam7-7.6.14}/src/LICENSE +0 -0
  32. {gam7-7.6.12 → gam7-7.6.14}/src/cacerts.pem +0 -0
  33. {gam7-7.6.12 → gam7-7.6.14}/src/callgam.py +0 -0
  34. {gam7-7.6.12 → gam7-7.6.14}/src/gam/__main__.py +0 -0
  35. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/__init__.py +0 -0
  36. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/auth.py +0 -0
  37. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/client.py +0 -0
  38. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/core.py +0 -0
  39. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/data.py +0 -0
  40. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/http.py +0 -0
  41. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/http_core.py +0 -0
  42. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/http_interface.py +0 -0
  43. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/mock_http.py +0 -0
  44. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/mock_http_core.py +0 -0
  45. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/mock_service.py +0 -0
  46. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/service.py +0 -0
  47. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/token_store.py +0 -0
  48. {gam7-7.6.12 → gam7-7.6.14}/src/gam/atom/url.py +0 -0
  49. {gam7-7.6.12 → gam7-7.6.14}/src/gam/cacerts.pem +0 -0
  50. {gam7-7.6.12 → gam7-7.6.14}/src/gam/cbcm-v1.1beta1.json +0 -0
  51. {gam7-7.6.12 → gam7-7.6.14}/src/gam/contactdelegation-v1.json +0 -0
  52. {gam7-7.6.12 → gam7-7.6.14}/src/gam/datastudio-v1.json +0 -0
  53. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/__init__.py +0 -0
  54. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glaction.py +0 -0
  55. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glapi.py +0 -0
  56. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glcfg.py +0 -0
  57. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glclargs.py +0 -0
  58. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glentity.py +0 -0
  59. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glgapi.py +0 -0
  60. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glgdata.py +0 -0
  61. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glglobals.py +0 -0
  62. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glindent.py +0 -0
  63. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glmsgs.py +0 -0
  64. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glskus.py +0 -0
  65. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/gluprop.py +0 -0
  66. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/glverlibs.py +0 -0
  67. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gamlib/yubikey.py +0 -0
  68. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/__init__.py +0 -0
  69. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/alt/__init__.py +0 -0
  70. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/alt/app_engine.py +0 -0
  71. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/alt/appengine.py +0 -0
  72. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/__init__.py +0 -0
  73. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/audit/__init__.py +0 -0
  74. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/audit/service.py +0 -0
  75. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  76. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/contacts/service.py +0 -0
  77. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/apps/service.py +0 -0
  78. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/service.py +0 -0
  79. {gam7-7.6.12 → gam7-7.6.14}/src/gam/gdata/urlfetch.py +0 -0
  80. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/__init__.py +0 -0
  81. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/_auth.py +0 -0
  82. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/_helpers.py +0 -0
  83. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/channel.py +0 -0
  84. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/discovery.py +0 -0
  85. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  86. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  87. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  88. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  89. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/errors.py +0 -0
  90. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/http.py +0 -0
  91. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/mimeparse.py +0 -0
  92. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/model.py +0 -0
  93. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/schema.py +0 -0
  94. {gam7-7.6.12 → gam7-7.6.14}/src/gam/googleapiclient/version.py +0 -0
  95. {gam7-7.6.12 → gam7-7.6.14}/src/gam/iso8601/__init__.py +0 -0
  96. {gam7-7.6.12 → gam7-7.6.14}/src/gam/iso8601/iso8601.py +0 -0
  97. {gam7-7.6.12 → gam7-7.6.14}/src/gam/meet-v2beta.json +0 -0
  98. {gam7-7.6.12 → gam7-7.6.14}/src/gam/serviceaccountlookup-v1.json +0 -0
  99. {gam7-7.6.12 → gam7-7.6.14}/src/gam/six.py +0 -0
  100. {gam7-7.6.12 → gam7-7.6.14}/src/gam-install.sh +0 -0
  101. {gam7-7.6.12 → gam7-7.6.14}/src/gam-setup.bat +0 -0
  102. {gam7-7.6.12 → gam7-7.6.14}/src/gam.exe.manifest +0 -0
  103. {gam7-7.6.12 → gam7-7.6.14}/src/gam.py +0 -0
  104. {gam7-7.6.12 → gam7-7.6.14}/src/gam.spec +0 -0
  105. {gam7-7.6.12 → gam7-7.6.14}/src/gam.wxs +0 -0
  106. {gam7-7.6.12 → gam7-7.6.14}/src/license.rtf +0 -0
  107. {gam7-7.6.12 → gam7-7.6.14}/src/requirements-dev.txt +0 -0
  108. {gam7-7.6.12 → gam7-7.6.14}/src/requirements.txt +0 -0
  109. {gam7-7.6.12 → gam7-7.6.14}/src/setup.cfg +0 -0
  110. {gam7-7.6.12 → gam7-7.6.14}/src/setup.py +0 -0
  111. {gam7-7.6.12 → gam7-7.6.14}/src/tools/a_atleast_b.py +0 -0
  112. {gam7-7.6.12 → gam7-7.6.14}/src/tools/gen-wix-xml-filelist.py +0 -0
  113. {gam7-7.6.12 → gam7-7.6.14}/src/tools/mkGamRef.py +0 -0
  114. {gam7-7.6.12 → gam7-7.6.14}/src/tools/openssl.props +0 -0
  115. {gam7-7.6.12 → gam7-7.6.14}/src/version_info.txt.in +0 -0
  116. {gam7-7.6.12 → gam7-7.6.14}/wiki/00scratch.md +0 -0
  117. {gam7-7.6.12 → gam7-7.6.14}/wiki/Addresses.md +0 -0
  118. {gam7-7.6.12 → gam7-7.6.14}/wiki/Alert-Center.md +0 -0
  119. {gam7-7.6.12 → gam7-7.6.14}/wiki/Aliases.md +0 -0
  120. {gam7-7.6.12 → gam7-7.6.14}/wiki/Authorization.md +0 -0
  121. {gam7-7.6.12 → gam7-7.6.14}/wiki/BNF-Syntax.md +0 -0
  122. {gam7-7.6.12 → gam7-7.6.14}/wiki/Basic-Items.md +0 -0
  123. {gam7-7.6.12 → gam7-7.6.14}/wiki/Bulk-Processing.md +0 -0
  124. {gam7-7.6.12 → gam7-7.6.14}/wiki/CSV-Input-Filtering.md +0 -0
  125. {gam7-7.6.12 → gam7-7.6.14}/wiki/CSV-Output-Filtering.md +0 -0
  126. {gam7-7.6.12 → gam7-7.6.14}/wiki/CSV-Special-Characters.md +0 -0
  127. {gam7-7.6.12 → gam7-7.6.14}/wiki/Calendars-Access.md +0 -0
  128. {gam7-7.6.12 → gam7-7.6.14}/wiki/Calendars-Events.md +0 -0
  129. {gam7-7.6.12 → gam7-7.6.14}/wiki/Calendars.md +0 -0
  130. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chat-Bot.md +0 -0
  131. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-AUE-Counts.md +0 -0
  132. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  133. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Installed-Apps.md +0 -0
  134. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  135. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Policies.md +0 -0
  136. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Printers.md +0 -0
  137. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Profile-Management.md +0 -0
  138. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Version-Counts.md +0 -0
  139. {gam7-7.6.12 → gam7-7.6.14}/wiki/Chrome-Version-History.md +0 -0
  140. {gam7-7.6.12 → gam7-7.6.14}/wiki/ChromeOS-Devices.md +0 -0
  141. {gam7-7.6.12 → gam7-7.6.14}/wiki/Classroom-Courses.md +0 -0
  142. {gam7-7.6.12 → gam7-7.6.14}/wiki/Classroom-Guardians.md +0 -0
  143. {gam7-7.6.12 → gam7-7.6.14}/wiki/Classroom-Invitations.md +0 -0
  144. {gam7-7.6.12 → gam7-7.6.14}/wiki/Classroom-Membership.md +0 -0
  145. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Channel.md +0 -0
  146. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Identity-Devices.md +0 -0
  147. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  148. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Identity-Groups.md +0 -0
  149. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Identity-Policies.md +0 -0
  150. {gam7-7.6.12 → gam7-7.6.14}/wiki/Cloud-Storage.md +0 -0
  151. {gam7-7.6.12 → gam7-7.6.14}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  152. {gam7-7.6.12 → gam7-7.6.14}/wiki/Collections-of-Items.md +0 -0
  153. {gam7-7.6.12 → gam7-7.6.14}/wiki/Collections-of-Users.md +0 -0
  154. {gam7-7.6.12 → gam7-7.6.14}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  155. {gam7-7.6.12 → gam7-7.6.14}/wiki/Command-Line-Parsing.md +0 -0
  156. {gam7-7.6.12 → gam7-7.6.14}/wiki/Command-Logging-Progress.md +0 -0
  157. {gam7-7.6.12 → gam7-7.6.14}/wiki/Context-Aware-Access-Levels.md +0 -0
  158. {gam7-7.6.12 → gam7-7.6.14}/wiki/Customer.md +0 -0
  159. {gam7-7.6.12 → gam7-7.6.14}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  160. {gam7-7.6.12 → gam7-7.6.14}/wiki/Domain-SharedContacts-GAL.md +0 -0
  161. {gam7-7.6.12 → gam7-7.6.14}/wiki/Domains-Verification.md +0 -0
  162. {gam7-7.6.12 → gam7-7.6.14}/wiki/Domains.md +0 -0
  163. {gam7-7.6.12 → gam7-7.6.14}/wiki/Downloads-Installs.md +0 -0
  164. {gam7-7.6.12 → gam7-7.6.14}/wiki/Drive-File-Selection.md +0 -0
  165. {gam7-7.6.12 → gam7-7.6.14}/wiki/Drive-Items.md +0 -0
  166. {gam7-7.6.12 → gam7-7.6.14}/wiki/Drive-REST-API-v3.md +0 -0
  167. {gam7-7.6.12 → gam7-7.6.14}/wiki/Email-Audit-Monitor.md +0 -0
  168. {gam7-7.6.12 → gam7-7.6.14}/wiki/Find-File-Owner.md +0 -0
  169. {gam7-7.6.12 → gam7-7.6.14}/wiki/GAM-Public-Chat-Room.md +0 -0
  170. {gam7-7.6.12 → gam7-7.6.14}/wiki/GAM-Return-Codes.md +0 -0
  171. {gam7-7.6.12 → gam7-7.6.14}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  172. {gam7-7.6.12 → gam7-7.6.14}/wiki/GAM7-on-Android-Devices.md +0 -0
  173. {gam7-7.6.12 → gam7-7.6.14}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  174. {gam7-7.6.12 → gam7-7.6.14}/wiki/Google-Data-Transfers.md +0 -0
  175. {gam7-7.6.12 → gam7-7.6.14}/wiki/Google-Network-Addresses.md +0 -0
  176. {gam7-7.6.12 → gam7-7.6.14}/wiki/Groups-Membership.md +0 -0
  177. {gam7-7.6.12 → gam7-7.6.14}/wiki/Groups.md +0 -0
  178. {gam7-7.6.12 → gam7-7.6.14}/wiki/HTTPS-Proxy.md +0 -0
  179. {gam7-7.6.12 → gam7-7.6.14}/wiki/Home.md +0 -0
  180. {gam7-7.6.12 → gam7-7.6.14}/wiki/How-to-Install-GAM7.md +0 -0
  181. {gam7-7.6.12 → gam7-7.6.14}/wiki/How-to-Uninstall-GAM7.md +0 -0
  182. {gam7-7.6.12 → gam7-7.6.14}/wiki/How-to-Update-GAM7.md +0 -0
  183. {gam7-7.6.12 → gam7-7.6.14}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  184. {gam7-7.6.12 → gam7-7.6.14}/wiki/Inbound-SSO.md +0 -0
  185. {gam7-7.6.12 → gam7-7.6.14}/wiki/Install-GAM-as-Python-Library.md +0 -0
  186. {gam7-7.6.12 → gam7-7.6.14}/wiki/Licenses.md +0 -0
  187. {gam7-7.6.12 → gam7-7.6.14}/wiki/List-Items.md +0 -0
  188. {gam7-7.6.12 → gam7-7.6.14}/wiki/List.md +0 -0
  189. {gam7-7.6.12 → gam7-7.6.14}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  190. {gam7-7.6.12 → gam7-7.6.14}/wiki/Mobile-Devices.md +0 -0
  191. {gam7-7.6.12 → gam7-7.6.14}/wiki/Organizational-Units.md +0 -0
  192. {gam7-7.6.12 → gam7-7.6.14}/wiki/Other-Resources.md +0 -0
  193. {gam7-7.6.12 → gam7-7.6.14}/wiki/Permission-Matches.md +0 -0
  194. {gam7-7.6.12 → gam7-7.6.14}/wiki/Python-Regular-Expressions.md +0 -0
  195. {gam7-7.6.12 → gam7-7.6.14}/wiki/README.md +0 -0
  196. {gam7-7.6.12 → gam7-7.6.14}/wiki/Rclone.md +0 -0
  197. {gam7-7.6.12 → gam7-7.6.14}/wiki/Reports.md +0 -0
  198. {gam7-7.6.12 → gam7-7.6.14}/wiki/Reseller.md +0 -0
  199. {gam7-7.6.12 → gam7-7.6.14}/wiki/Resources.md +0 -0
  200. {gam7-7.6.12 → gam7-7.6.14}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  201. {gam7-7.6.12 → gam7-7.6.14}/wiki/SSL-Root-CA-Certificates.md +0 -0
  202. {gam7-7.6.12 → gam7-7.6.14}/wiki/Schemas.md +0 -0
  203. {gam7-7.6.12 → gam7-7.6.14}/wiki/Scripts.md +0 -0
  204. {gam7-7.6.12 → gam7-7.6.14}/wiki/Send-Email.md +0 -0
  205. {gam7-7.6.12 → gam7-7.6.14}/wiki/Shared-Drives.md +0 -0
  206. {gam7-7.6.12 → gam7-7.6.14}/wiki/Sites.md +0 -0
  207. {gam7-7.6.12 → gam7-7.6.14}/wiki/Tag-Replace.md +0 -0
  208. {gam7-7.6.12 → gam7-7.6.14}/wiki/Todrive.md +0 -0
  209. {gam7-7.6.12 → gam7-7.6.14}/wiki/Unmanaged-Accounts.md +0 -0
  210. {gam7-7.6.12 → gam7-7.6.14}/wiki/Upgrade-Benefits.md +0 -0
  211. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Analytics-Admin.md +0 -0
  212. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Application-Specific-Passwords.md +0 -0
  213. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Backup-Verification-Codes.md +0 -0
  214. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Calendars-Access.md +0 -0
  215. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Calendars-Events.md +0 -0
  216. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Calendars.md +0 -0
  217. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Chat.md +0 -0
  218. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Classification-Labels.md +0 -0
  219. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Classroom-Profile.md +0 -0
  220. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Contacts-Delegates.md +0 -0
  221. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Contacts.md +0 -0
  222. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Deprovision.md +0 -0
  223. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Activity-Settings.md +0 -0
  224. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Cleanup.md +0 -0
  225. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Comments.md +0 -0
  226. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Files-Manage.md +0 -0
  227. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Orphans.md +0 -0
  228. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Ownership.md +0 -0
  229. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Permissions.md +0 -0
  230. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Query.md +0 -0
  231. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Revisions.md +0 -0
  232. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Shortcuts.md +0 -0
  233. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Drive-Transfer.md +0 -0
  234. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Forms.md +0 -0
  235. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-CSE.md +0 -0
  236. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Delegates.md +0 -0
  237. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Filters.md +0 -0
  238. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Forwarding.md +0 -0
  239. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Labels.md +0 -0
  240. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  241. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Profile.md +0 -0
  242. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-S-MIME.md +0 -0
  243. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  244. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Gmail-Settings.md +0 -0
  245. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Group-Membership.md +0 -0
  246. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Keep-Notes.md +0 -0
  247. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Looker-Studio.md +0 -0
  248. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Meet.md +0 -0
  249. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-People-Contacts-Profiles.md +0 -0
  250. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Photo.md +0 -0
  251. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Profile-Photo.md +0 -0
  252. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Profile-Sharing.md +0 -0
  253. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Shared-Drives.md +0 -0
  254. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  255. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Spreadsheets.md +0 -0
  256. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Tasks.md +0 -0
  257. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-Tokens.md +0 -0
  258. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users-YouTube.md +0 -0
  259. {gam7-7.6.12 → gam7-7.6.14}/wiki/Users.md +0 -0
  260. {gam7-7.6.12 → gam7-7.6.14}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  261. {gam7-7.6.12 → gam7-7.6.14}/wiki/Vault-Takeout.md +0 -0
  262. {gam7-7.6.12 → gam7-7.6.14}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  263. {gam7-7.6.12 → gam7-7.6.14}/wiki/_Sidebar.md +0 -0
  264. {gam7-7.6.12 → gam7-7.6.14}/wiki/gam.cfg.md +0 -0
  265. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-AdminSettingsExamples.md +0 -0
  266. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Android-Installation.md +0 -0
  267. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-BulkOperations.md +0 -0
  268. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-CalendarExamples.md +0 -0
  269. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Chat-Bot.md +0 -0
  270. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Chrome-Browser-Management.md +0 -0
  271. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Chrome-OS-Installation.md +0 -0
  272. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Chrome-Policy-Settings.md +0 -0
  273. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Cloud-Identity-Groups.md +0 -0
  274. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  275. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Calendars.md +0 -0
  276. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Definitions.md +0 -0
  277. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Drive.md +0 -0
  278. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Email.md +0 -0
  279. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  280. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Groups.md +0 -0
  281. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Command-Reference-Users.md +0 -0
  282. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  283. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  284. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-CreatingClientSecretsFile.md +0 -0
  285. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Custom-Schemas.md +0 -0
  286. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Data-Transfers.md +0 -0
  287. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-DomainVerification.md +0 -0
  288. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-ExamplesAccountAuditing.md +0 -0
  289. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-ExamplesCSV.md +0 -0
  290. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-ExamplesEmailSettings.md +0 -0
  291. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-ExamplesOrganizations.md +0 -0
  292. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM-Discussion-Group.md +0 -0
  293. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  294. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM-options-files.md +0 -0
  295. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  296. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM3CSVListings.md +0 -0
  297. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM3DirectoryCommands.md +0 -0
  298. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM3GroupSettings.md +0 -0
  299. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GAM7-FAQ.md +0 -0
  300. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  301. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-GoogleDriveManagement.md +0 -0
  302. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  303. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Home.md +0 -0
  304. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  305. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Inbound-SSO-Settings.md +0 -0
  306. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-LicenseExamples.md +0 -0
  307. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Managing-Admins.md +0 -0
  308. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  309. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Managing-Devices.md +0 -0
  310. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Managing-Google-Classroom.md +0 -0
  311. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-OAuthKeyManagement.md +0 -0
  312. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Printers.md +0 -0
  313. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-ResellerCommands.md +0 -0
  314. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  315. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-SecurityExamples.md +0 -0
  316. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-UnmanagedUsersExamples.md +0 -0
  317. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Use-a-Yubikey.md +0 -0
  318. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  319. {gam7-7.6.12 → gam7-7.6.14}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.6.12
3
+ Version: 7.6.14
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
@@ -1461,16 +1461,21 @@ gam <UserTypeEntity> update serviceaccount (scope|scopes <APIScopeURLList>)*
1461
1461
  gam print privileges [todrive <ToDriveAttribute>*]
1462
1462
  gam show privileges
1463
1463
 
1464
+ <Privilege> ::= <String>
1465
+ <PrivilegeList> ::= "<Privilege>(,<Privilege)*"
1464
1466
  <RoleAssignmentID> ::= <String>
1465
1467
  <RoleItem> ::= id:<String>|uid:<string>|<String>
1466
1468
 
1467
- gam create adminrole <String> privileges all|all_ou|<PrivilegesList> [description <String>]
1468
- gam update adminrole <RoleItem> [name <String>] [privileges all|all_ou|<PrivilegesList>] [description <String>]
1469
+ gam create adminrole <String> [description <String>]
1470
+ privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)
1471
+ gam update adminrole <RoleItem> [name <String>] [description <String>]
1472
+ [privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)]
1469
1473
  gam delete adminrole <RoleItem>
1470
1474
  gam info adminrole <RoleItem> [privileges]
1471
1475
  gam print adminroles|roles [todrive <ToDriveAttribute>*]
1472
- [privileges] [oneitemperrow]
1473
- gam show adminroles|roles [privileges]
1476
+ [role <RoleItem>] [privileges] [oneitemperrow]
1477
+ gam show adminroles|roles
1478
+ [role <RoleItem>] [privileges]
1474
1479
 
1475
1480
  gam create|add admin <EmailAddress>|<UniqueID> <RoleItem> customer|(org_unit <OrgUnitItem>)
1476
1481
  [condition securitygroup|nonsecuritygroup]
@@ -1,3 +1,16 @@
1
+ 7.06.14
2
+
3
+ Updated `gam create|update adminrole` to allow specifying a collection of privileges
4
+ with `privileges select <FileSelector>|<CSVFileSelector>` which makes copying roles much simpler.
5
+
6
+ Updated option `role <RoleItem>` to `gam print|show adminroles` to allow display of information
7
+ for a specific role.
8
+
9
+ 7.06.13
10
+
11
+ Updated `gam print group-members ... recursive` and `gam print cigroup-members ... recursive`
12
+ to expand groups representing chat spaces.
13
+
1
14
  7.06.12
2
15
 
3
16
  Deleted commands to display Analytic UA properties; the API has been deprecated.
@@ -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.06.12'
28
+ __version__ = '7.06.14'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -5981,7 +5981,7 @@ def getCIGroupMemberRoleFixType(member):
5981
5981
  else:
5982
5982
  member['type'] = Ent.TYPE_OTHER
5983
5983
  roles = {}
5984
- memberRoles = member.get('roles', [{'name': Ent.MEMBER}])
5984
+ memberRoles = member.get('roles', [{'name': Ent.ROLE_MEMBER}])
5985
5985
  for role in memberRoles:
5986
5986
  roles[role['name']] = role
5987
5987
  for a_role in [Ent.ROLE_OWNER, Ent.ROLE_MANAGER, Ent.ROLE_MEMBER]:
@@ -6019,7 +6019,7 @@ def getCIGroupTransitiveMemberRoleFixType(groupName, tmember):
6019
6019
  trole['name'] = Ent.ROLE_MANAGER
6020
6020
  memberRoles.append(trole)
6021
6021
  else:
6022
- memberRoles = [{'name': Ent.MEMBER}]
6022
+ memberRoles = [{'name': Ent.ROLE_MEMBER}]
6023
6023
  roles = {}
6024
6024
  for role in memberRoles:
6025
6025
  roles[role['name']] = role
@@ -16497,8 +16497,10 @@ def getRoleId():
16497
16497
  invalidChoiceExit(role, GM.Globals[GM.MAP_ROLE_NAME_TO_ID], True)
16498
16498
  return (role, roleId)
16499
16499
 
16500
- # gam create adminrole <String> privileges all|all_ou|<PrivilegesList> [description <String>]
16501
- # gam update adminrole <RoleItem> [name <String>] [privileges all|all_ou|<PrivilegesList>] [description <String>]
16500
+ # gam create adminrole <String> [description <String>]
16501
+ # privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)
16502
+ # gam update adminrole <RoleItem> [name <String>] [description <String>]
16503
+ # [privileges all|all_ou|<PrivilegesList>|(select <FileSelector>|<CSVFileSelector>)]
16502
16504
  def doCreateUpdateAdminRoles():
16503
16505
  def expandChildPrivileges(privilege):
16504
16506
  for childPrivilege in privilege.get('childPrivileges', []):
@@ -16529,8 +16531,12 @@ def doCreateUpdateAdminRoles():
16529
16531
  elif privs == 'ALL_OU':
16530
16532
  body['rolePrivileges'] = [{'privilegeName': p, 'serviceId': v} for p, v in ouPrivileges.items()]
16531
16533
  else:
16534
+ if privs == 'SELECT':
16535
+ privsList = [p.upper() for p in getEntityList(Cmd.OB_PRIVILEGE_LIST)]
16536
+ else:
16537
+ privsList = privs.replace(',', ' ').split()
16532
16538
  body.setdefault('rolePrivileges', [])
16533
- for p in privs.split(','):
16539
+ for p in privsList:
16534
16540
  if p in allPrivileges:
16535
16541
  body['rolePrivileges'].append({'privilegeName': p, 'serviceId': allPrivileges[p]})
16536
16542
  elif p in ouPrivileges:
@@ -16540,6 +16546,8 @@ def doCreateUpdateAdminRoles():
16540
16546
  elif ':' in p:
16541
16547
  priv, serv = p.split(':')
16542
16548
  body['rolePrivileges'].append({'privilegeName': priv, 'serviceId': serv.lower()})
16549
+ elif p == 'SUPPORT':
16550
+ pass
16543
16551
  else:
16544
16552
  invalidChoiceExit(p, list(allPrivileges.keys())+list(ouPrivileges.keys())+list(childPrivileges.keys()), True)
16545
16553
  elif myarg == 'description':
@@ -16557,12 +16565,12 @@ def doCreateUpdateAdminRoles():
16557
16565
  customer=GC.Values[GC.CUSTOMER_ID], body=body, fields='roleId,roleName')
16558
16566
  else:
16559
16567
  result = callGAPI(cd.roles(), 'patch',
16560
- throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND, GAPI.FORBIDDEN]+[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION],
16568
+ throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND, GAPI.FORBIDDEN]+[GAPI.NOT_FOUND, GAPI.FAILED_PRECONDITION, GAPI.CONFLICT],
16561
16569
  customer=GC.Values[GC.CUSTOMER_ID], roleId=roleId, body=body, fields='roleId,roleName')
16562
16570
  entityActionPerformed([Ent.ADMIN_ROLE, f"{result['roleName']}({result['roleId']})"])
16563
16571
  except GAPI.duplicate as e:
16564
16572
  entityActionFailedWarning([Ent.ADMIN_ROLE, f"{body['roleName']}"], str(e))
16565
- except (GAPI.notFound, GAPI.forbidden, GAPI.failedPrecondition) as e:
16573
+ except (GAPI.notFound, GAPI.forbidden, GAPI.failedPrecondition, GAPI.conflict) as e:
16566
16574
  entityActionFailedWarning([Ent.ADMIN_ROLE, roleId], str(e))
16567
16575
  except (GAPI.badRequest, GAPI.customerNotFound):
16568
16576
  accessErrorExit(cd)
@@ -16605,61 +16613,53 @@ def _showAdminRole(role, i=0, count=0):
16605
16613
  Ind.Decrement()
16606
16614
 
16607
16615
  # gam info adminrole <RoleItem> [privileges]
16608
- def doInfoAdminRole():
16609
- cd = buildGAPIObject(API.DIRECTORY)
16610
- fieldsList = PRINT_ADMIN_ROLES_FIELDS[:]
16611
- _, roleId = getRoleId()
16612
- while Cmd.ArgumentsRemaining():
16613
- myarg = getArgument()
16614
- if myarg == 'privileges':
16615
- fieldsList.append('rolePrivileges')
16616
- else:
16617
- unknownArgumentExit()
16618
- fields = getFieldsFromFieldsList(fieldsList)
16619
- try:
16620
- role = callGAPI(cd.roles(), 'get',
16621
- throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.FAILED_PRECONDITION,
16622
- GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND],
16623
- customer=GC.Values[GC.CUSTOMER_ID], roleId=roleId, fields=fields)
16624
- role.setdefault('isSuperAdminRole', False)
16625
- role.setdefault('isSystemRole', False)
16626
- _showAdminRole(role)
16627
- except (GAPI.notFound, GAPI.forbidden, GAPI.failedPrecondition) as e:
16628
- entityActionFailedWarning([Ent.ADMIN_ROLE, roleId], str(e))
16629
- except (GAPI.badRequest, GAPI.customerNotFound):
16630
- accessErrorExit(cd)
16631
-
16632
16616
  # gam print adminroles|roles [todrive <ToDriveAttribute>*]
16633
- # [privileges] [oneitemperrow]
16634
- # gam show adminroles|roles [privileges]
16635
- def doPrintShowAdminRoles():
16617
+ # [role <RoleItem>] [privileges] [oneitemperrow]
16618
+ # gam show adminroles|roles
16619
+ # [role <RoleItem>] [privileges]
16620
+ def doInfoPrintShowAdminRoles():
16636
16621
  cd = buildGAPIObject(API.DIRECTORY)
16637
16622
  fieldsList = PRINT_ADMIN_ROLES_FIELDS[:]
16638
16623
  csvPF = CSVPrintFile(fieldsList, PRINT_ADMIN_ROLES_FIELDS) if Act.csvFormat() else None
16639
16624
  oneItemPerRow = False
16625
+ if Act.Get() != Act.INFO:
16626
+ roleId = None
16627
+ else:
16628
+ _, roleId = getRoleId()
16640
16629
  while Cmd.ArgumentsRemaining():
16641
16630
  myarg = getArgument()
16642
16631
  if csvPF and myarg == 'todrive':
16643
16632
  csvPF.GetTodriveParameters()
16633
+ elif roleId is None and myarg == 'role':
16634
+ _, roleId = getRoleId()
16644
16635
  elif myarg == 'privileges':
16645
16636
  fieldsList.append('rolePrivileges')
16646
16637
  elif myarg == 'oneitemperrow':
16647
16638
  oneItemPerRow = True
16648
16639
  else:
16649
16640
  unknownArgumentExit()
16650
- if csvPF:
16641
+ if csvPF and 'rolePrivileges' in fieldsList:
16651
16642
  if not oneItemPerRow:
16652
16643
  csvPF.AddTitles(['rolePrivileges'])
16653
16644
  else:
16654
16645
  csvPF.AddTitles(['privilegeName', 'serviceId'])
16655
- fields = getItemFieldsFromFieldsList('items', fieldsList)
16656
- printGettingAllAccountEntities(Ent.ADMIN_ROLE)
16657
16646
  try:
16658
- roles = callGAPIpages(cd.roles(), 'list', 'items',
16659
- pageMessage=getPageMessage(),
16660
- throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND, GAPI.FORBIDDEN],
16661
- customer=GC.Values[GC.CUSTOMER_ID], fields=fields)
16662
- except (GAPI.badRequest, GAPI.customerNotFound, GAPI.forbidden):
16647
+ if roleId is None:
16648
+ fields = getItemFieldsFromFieldsList('items', fieldsList)
16649
+ printGettingAllAccountEntities(Ent.ADMIN_ROLE)
16650
+ roles = callGAPIpages(cd.roles(), 'list', 'items',
16651
+ pageMessage=getPageMessage(),
16652
+ throwReasons=[GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND, GAPI.FORBIDDEN],
16653
+ customer=GC.Values[GC.CUSTOMER_ID], fields=fields)
16654
+ else:
16655
+ fields = getFieldsFromFieldsList(fieldsList)
16656
+ roles = [callGAPI(cd.roles(), 'get',
16657
+ throwReasons=[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.FAILED_PRECONDITION,
16658
+ GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND],
16659
+ customer=GC.Values[GC.CUSTOMER_ID], roleId=roleId, fields=fields)]
16660
+ except (GAPI.notFound, GAPI.forbidden, GAPI.failedPrecondition) as e:
16661
+ entityActionFailedWarning([Ent.ADMIN_ROLE, roleId], str(e))
16662
+ except (GAPI.badRequest, GAPI.customerNotFound):
16663
16663
  accessErrorExit(cd)
16664
16664
  for role in roles:
16665
16665
  role.setdefault('isSuperAdminRole', False)
@@ -26478,6 +26478,64 @@ def _getChatMemberEmail(cd, member):
26478
26478
  _, memberUid = member['groupMember']['name'].split('/')
26479
26479
  member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
26480
26480
 
26481
+ def _getChatSpaceMembers(cd, chatSpace, ciGroupName):
26482
+ if chatSpace.startswith('space/'):
26483
+ _, chatSpace = chatSpace.split('/', 1)
26484
+ chatSpace = 'spaces/'+chatSpace
26485
+ kwargsUAA = {'useAdminAccess': True, 'filter': 'member.type != "BOT"'}
26486
+ user, chat, kvList = buildChatServiceObject(API.CHAT_MEMBERSHIPS_ADMIN, _getAdminEmail(), 0, 0, [Ent.CHAT_SPACE, chatSpace], True)
26487
+ memberList = []
26488
+ if not chat:
26489
+ return memberList
26490
+ fields = getItemFieldsFromFieldsList('memberships', [])
26491
+ qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {chatSpace}, {kwargsUAA["filter"]}'
26492
+ try:
26493
+ members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
26494
+ pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, 0, 0, qfilter),
26495
+ throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
26496
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
26497
+ parent=chatSpace, fields=fields, pageSize=CHAT_PAGE_SIZE, **kwargsUAA)
26498
+ for member in members:
26499
+ _getChatMemberEmail(cd, member)
26500
+ gmember = {}
26501
+ if 'member' in member:
26502
+ if member['member']['type'] == 'HUMAN':
26503
+ _, memberUid = member['member']['name'].split('/')
26504
+ gmember['type'] = Ent.TYPE_USER
26505
+ email, _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['user'])
26506
+ role = Ent.ROLE_MANAGER if member['role'] == 'ROLE_MANAGER' else Ent.ROLE_MEMBER
26507
+ if not ciGroupName:
26508
+ gmember['id'] = memberUid
26509
+ gmember['email'] = email
26510
+ gmember['role'] = role
26511
+ gmember['status'] = member['state']
26512
+ else:
26513
+ gmember['name'] = f'{ciGroupName}/memberships/{memberUid}'
26514
+ gmember['preferredMemberKey'] = {'id': email}
26515
+ gmember['roles'] = [{'name': role}]
26516
+ gmember['createTime'] = member['createTime']
26517
+ memberList.append(gmember)
26518
+ elif 'groupMember' in member:
26519
+ _, memberUid = member['groupMember']['name'].split('/')
26520
+ gmember['type'] = Ent.TYPE_GROUP
26521
+ role = Ent.ROLE_MANAGER if member['role'] == 'ROLE_MANAGER' else Ent.ROLE_MEMBER
26522
+ email, _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
26523
+ if not ciGroupName:
26524
+ gmember['id'] = memberUid
26525
+ gmember['email'] = email
26526
+ gmember['role'] = role
26527
+ gmember['status'] = member['state']
26528
+ else:
26529
+ gmember['name'] = f'{ciGroupName}/memberships/{memberUid}'
26530
+ gmember['preferredMemberKey'] = {'id': email}
26531
+ gmember['roles'] = [{'name': role}]
26532
+ gmember['createTime'] = member['createTime']
26533
+ memberList.append(gmember)
26534
+ return memberList
26535
+ except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
26536
+ exitIfChatNotConfigured(chat, kvList, str(e), 0, 0)
26537
+ return memberList
26538
+
26481
26539
  def normalizeUserMember(user, userList):
26482
26540
  userList.append(normalizeEmailAddressOrUID(user))
26483
26541
 
@@ -34138,15 +34196,18 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
34138
34196
 
34139
34197
  printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, groupEmail, i, count)
34140
34198
  validRoles, listRoles, listFields = _getRoleVerification(memberRoles, 'nextPageToken,members(email,id,role,status,type,delivery_settings)')
34141
- try:
34142
- groupMembers = callGAPIpages(cd.members(), 'list', 'members',
34143
- pageMessage=getPageMessageForWhom(),
34144
- throwReasons=GAPI.MEMBERS_THROW_REASONS, retryReasons=GAPI.MEMBERS_RETRY_REASONS,
34145
- includeDerivedMembership=memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP],
34146
- groupKey=groupEmail, roles=listRoles, fields=listFields, maxResults=GC.Values[GC.MEMBER_MAX_RESULTS])
34147
- except (GAPI.groupNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, GAPI.invalid, GAPI.forbidden, GAPI.serviceNotAvailable):
34148
- entityUnknownWarning(Ent.GROUP, groupEmail, i, count)
34149
- return
34199
+ if not groupEmail.startswith('space/'):
34200
+ try:
34201
+ groupMembers = callGAPIpages(cd.members(), 'list', 'members',
34202
+ pageMessage=getPageMessageForWhom(),
34203
+ throwReasons=GAPI.MEMBERS_THROW_REASONS, retryReasons=GAPI.MEMBERS_RETRY_REASONS,
34204
+ includeDerivedMembership=memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP],
34205
+ groupKey=groupEmail, roles=listRoles, fields=listFields, maxResults=GC.Values[GC.MEMBER_MAX_RESULTS])
34206
+ except (GAPI.groupNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, GAPI.invalid, GAPI.forbidden, GAPI.serviceNotAvailable):
34207
+ entityUnknownWarning(Ent.GROUP, groupEmail, i, count)
34208
+ return
34209
+ else:
34210
+ groupMembers = _getChatSpaceMembers(cd, groupEmail, '')
34150
34211
  checkCategory = memberDisplayOptions['showCategory']
34151
34212
  if not memberOptions[MEMBEROPTION_RECURSIVE]:
34152
34213
  if memberOptions[MEMBEROPTION_NODUPLICATES]:
@@ -34170,8 +34231,7 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
34170
34231
  elif memberOptions[MEMBEROPTION_NODUPLICATES]:
34171
34232
  groupMemberList = []
34172
34233
  for member in groupMembers:
34173
- namespace = member['email'].find('@') == -1
34174
- if member['type'] != Ent.TYPE_GROUP or namespace:
34234
+ if member['type'] != Ent.TYPE_GROUP:
34175
34235
  if ((member['type'] in typesSet and
34176
34236
  checkMemberMatch(member, memberOptions) and
34177
34237
  _checkMemberRoleIsSuspendedIsArchived(member, validRoles, memberOptions[MEMBEROPTION_ISSUSPENDED], memberOptions[MEMBEROPTION_ISARCHIVED]) and
@@ -34200,8 +34260,7 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
34200
34260
  memberOptions, memberDisplayOptions, level+1, typesSet)
34201
34261
  else:
34202
34262
  for member in groupMembers:
34203
- namespace = member['email'].find('@') == -1
34204
- if member['type'] != Ent.TYPE_GROUP or namespace:
34263
+ if member['type'] != Ent.TYPE_GROUP:
34205
34264
  if ((member['type'] in typesSet) and
34206
34265
  checkMemberMatch(member, memberOptions) and
34207
34266
  _checkMemberRoleIsSuspendedIsArchived(member, validRoles,
@@ -36253,7 +36312,7 @@ def getCIGroupTransitiveMembers(ci, groupName, membersList, i, count):
36253
36312
  return True
36254
36313
 
36255
36314
  def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, count,
36256
- memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs):
36315
+ memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs, cd):
36257
36316
  nameToPrint = groupEmail if groupEmail else groupName
36258
36317
  printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, nameToPrint, i, count)
36259
36318
  validRoles = _getCIRoleVerification(memberRoles)
@@ -36266,16 +36325,21 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
36266
36325
  if member['type'] in typesSet and checkCIMemberMatch(member, memberOptions):
36267
36326
  membersList.append(member)
36268
36327
  return
36269
- try:
36270
- groupMembers = callGAPIpages(ci.groups().memberships(), 'list', 'memberships',
36271
- pageMessage=getPageMessageForWhom(),
36272
- throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36273
- parent=groupName, **kwargs)
36274
- except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis,
36275
- GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError,
36276
- GAPI.permissionDenied, GAPI.serviceNotAvailable):
36277
- entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, nameToPrint, i, count)
36278
- return
36328
+ if not groupEmail.startswith('space/'):
36329
+ try:
36330
+ groupMembers = callGAPIpages(ci.groups().memberships(), 'list', 'memberships',
36331
+ pageMessage=getPageMessageForWhom(),
36332
+ throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
36333
+ parent=groupName, **kwargs)
36334
+ except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis,
36335
+ GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError,
36336
+ GAPI.permissionDenied, GAPI.serviceNotAvailable):
36337
+ entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, nameToPrint, i, count)
36338
+ return
36339
+ else:
36340
+ if cd is None:
36341
+ cd = buildGAPIObject(API.DIRECTORY)
36342
+ groupMembers = _getChatSpaceMembers(cd, groupEmail, groupName)
36279
36343
  checkCategory = memberDisplayOptions['showCategory']
36280
36344
  if not memberOptions[MEMBEROPTION_RECURSIVE]:
36281
36345
  if memberOptions[MEMBEROPTION_NODUPLICATES]:
@@ -36300,8 +36364,7 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
36300
36364
  for member in groupMembers:
36301
36365
  getCIGroupMemberRoleFixType(member)
36302
36366
  memberName = member.get('preferredMemberKey', {}).get('id', '')
36303
- namespace = member.get('preferredMemberKey', {}).get('namespace', '')
36304
- if member['type'] != Ent.TYPE_GROUP or namespace:
36367
+ if member['type'] != Ent.TYPE_GROUP:
36305
36368
  if (member['type'] in typesSet and
36306
36369
  checkCIMemberMatch(member, memberOptions) and
36307
36370
  _checkMemberRole(member, validRoles) and
@@ -36324,13 +36387,12 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
36324
36387
  groupMemberList.append((f'groups/{gname}', memberName))
36325
36388
  for member in groupMemberList:
36326
36389
  getCIGroupMembers(ci, member[0], memberRoles, membersList, membersSet, i, count,
36327
- memberOptions, memberDisplayOptions, level+1, typesSet, member[1], kwargs)
36390
+ memberOptions, memberDisplayOptions, level+1, typesSet, member[1], kwargs, cd)
36328
36391
  else:
36329
36392
  for member in groupMembers:
36330
36393
  getCIGroupMemberRoleFixType(member)
36331
36394
  memberName = member.get('preferredMemberKey', {}).get('id', '')
36332
- namespace = member.get('preferredMemberKey', {}).get('namespace', '')
36333
- if member['type'] != Ent.TYPE_GROUP or namespace:
36395
+ if member['type'] != Ent.TYPE_GROUP:
36334
36396
  if (member['type'] in typesSet and
36335
36397
  checkCIMemberMatch(member, memberOptions) and
36336
36398
  _checkMemberRole(member, validRoles) and
@@ -36347,7 +36409,7 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
36347
36409
  membersList.append(member)
36348
36410
  _, gname = member['name'].rsplit('/', 1)
36349
36411
  getCIGroupMembers(ci, f'groups/{gname}', memberRoles, membersList, membersSet, i, count,
36350
- memberOptions, memberDisplayOptions, level+1, typesSet, memberName, kwargs)
36412
+ memberOptions, memberDisplayOptions, level+1, typesSet, memberName, kwargs, cd)
36351
36413
 
36352
36414
  CIGROUPMEMBERS_FIELDS_CHOICE_MAP = {
36353
36415
  'createtime': 'createTime',
@@ -36511,7 +36573,7 @@ def doPrintCIGroupMembers():
36511
36573
  membersList = []
36512
36574
  membersSet = set()
36513
36575
  getCIGroupMembers(ci, groupEntity['name'], getRoles, membersList, membersSet, i, count,
36514
- memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs)
36576
+ memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs, None)
36515
36577
  if showOwnedBy and not checkCIGroupShowOwnedBy(showOwnedBy, membersList):
36516
36578
  continue
36517
36579
  for member in membersList:
@@ -75551,7 +75613,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75551
75613
  ),
75552
75614
  'info':
75553
75615
  (Act.INFO,
75554
- {Cmd.ARG_ADMINROLE: doInfoAdminRole,
75616
+ {Cmd.ARG_ADMINROLE: doInfoPrintShowAdminRoles,
75555
75617
  Cmd.ARG_ALERT: doInfoAlert,
75556
75618
  Cmd.ARG_ALIAS: doInfoAliases,
75557
75619
  Cmd.ARG_BUILDING: doInfoBuilding,
@@ -75626,7 +75688,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75626
75688
  'print':
75627
75689
  (Act.PRINT,
75628
75690
  {Cmd.ARG_ADDRESSES: doPrintAddresses,
75629
- Cmd.ARG_ADMINROLE: doPrintShowAdminRoles,
75691
+ Cmd.ARG_ADMINROLE: doInfoPrintShowAdminRoles,
75630
75692
  Cmd.ARG_ADMIN: doPrintShowAdmins,
75631
75693
  Cmd.ARG_ALERT: doPrintShowAlerts,
75632
75694
  Cmd.ARG_ALERTFEEDBACK: doPrintShowAlertFeedback,
@@ -75759,7 +75821,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75759
75821
  ),
75760
75822
  'show':
75761
75823
  (Act.SHOW,
75762
- {Cmd.ARG_ADMINROLE: doPrintShowAdminRoles,
75824
+ {Cmd.ARG_ADMINROLE: doInfoPrintShowAdminRoles,
75763
75825
  Cmd.ARG_ADMIN: doPrintShowAdmins,
75764
75826
  Cmd.ARG_ALERT: doPrintShowAlerts,
75765
75827
  Cmd.ARG_ALERTFEEDBACK: doPrintShowAlertFeedback,