gam7 7.9.4__tar.gz → 7.9.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.
Files changed (318) hide show
  1. {gam7-7.9.4 → gam7-7.9.6}/PKG-INFO +1 -1
  2. {gam7-7.9.4 → gam7-7.9.6}/src/GamCommands.txt +8 -8
  3. {gam7-7.9.4 → gam7-7.9.6}/src/GamUpdate.txt +11 -0
  4. {gam7-7.9.4 → gam7-7.9.6}/src/gam/__init__.py +133 -74
  5. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Policies.md +146 -238
  6. {gam7-7.9.4 → gam7-7.9.6}/wiki/GamUpdates.md +14 -0
  7. {gam7-7.9.4 → gam7-7.9.6}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +4 -4
  8. {gam7-7.9.4 → gam7-7.9.6}/wiki/Version-and-Help.md +10 -10
  9. {gam7-7.9.4 → gam7-7.9.6}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  10. {gam7-7.9.4 → gam7-7.9.6}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  11. {gam7-7.9.4 → gam7-7.9.6}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  12. {gam7-7.9.4 → gam7-7.9.6}/.github/ISSUE_TEMPLATE.txt +0 -0
  13. {gam7-7.9.4 → gam7-7.9.6}/.github/actions/decrypt.sh +0 -0
  14. {gam7-7.9.4 → gam7-7.9.6}/.github/actions/entitlements.plist +0 -0
  15. {gam7-7.9.4 → gam7-7.9.6}/.github/actions/package_exclusions.txt +0 -0
  16. {gam7-7.9.4 → gam7-7.9.6}/.github/stale.yml +0 -0
  17. {gam7-7.9.4 → gam7-7.9.6}/.github/workflows/build.yml +0 -0
  18. {gam7-7.9.4 → gam7-7.9.6}/.github/workflows/codeql-analysis.yml +0 -0
  19. {gam7-7.9.4 → gam7-7.9.6}/.github/workflows/get-cacerts.yml +0 -0
  20. {gam7-7.9.4 → gam7-7.9.6}/.github/workflows/pushwiki.yml +0 -0
  21. {gam7-7.9.4 → gam7-7.9.6}/.github/workflows/pypi.yml +0 -0
  22. {gam7-7.9.4 → gam7-7.9.6}/.pre-commit-config.yaml +0 -0
  23. {gam7-7.9.4 → gam7-7.9.6}/LICENSE +0 -0
  24. {gam7-7.9.4 → gam7-7.9.6}/README.md +0 -0
  25. {gam7-7.9.4 → gam7-7.9.6}/pyproject.toml +0 -0
  26. {gam7-7.9.4 → gam7-7.9.6}/src/.gitignore +0 -0
  27. {gam7-7.9.4 → gam7-7.9.6}/src/LICENSE +0 -0
  28. {gam7-7.9.4 → gam7-7.9.6}/src/cacerts.pem +0 -0
  29. {gam7-7.9.4 → gam7-7.9.6}/src/callgam.py +0 -0
  30. {gam7-7.9.4 → gam7-7.9.6}/src/gam/__main__.py +0 -0
  31. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/__init__.py +0 -0
  32. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/auth.py +0 -0
  33. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/client.py +0 -0
  34. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/core.py +0 -0
  35. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/data.py +0 -0
  36. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/http.py +0 -0
  37. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/http_core.py +0 -0
  38. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/http_interface.py +0 -0
  39. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/mock_http.py +0 -0
  40. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/mock_http_core.py +0 -0
  41. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/mock_service.py +0 -0
  42. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/service.py +0 -0
  43. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/token_store.py +0 -0
  44. {gam7-7.9.4 → gam7-7.9.6}/src/gam/atom/url.py +0 -0
  45. {gam7-7.9.4 → gam7-7.9.6}/src/gam/cacerts.pem +0 -0
  46. {gam7-7.9.4 → gam7-7.9.6}/src/gam/cbcm-v1.1beta1.json +0 -0
  47. {gam7-7.9.4 → gam7-7.9.6}/src/gam/contactdelegation-v1.json +0 -0
  48. {gam7-7.9.4 → gam7-7.9.6}/src/gam/datastudio-v1.json +0 -0
  49. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/__init__.py +0 -0
  50. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glaction.py +0 -0
  51. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glapi.py +0 -0
  52. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glcfg.py +0 -0
  53. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glclargs.py +0 -0
  54. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glentity.py +0 -0
  55. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glgapi.py +0 -0
  56. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glgdata.py +0 -0
  57. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glglobals.py +0 -0
  58. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glindent.py +0 -0
  59. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glmsgs.py +0 -0
  60. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glskus.py +0 -0
  61. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/gluprop.py +0 -0
  62. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/glverlibs.py +0 -0
  63. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gamlib/yubikey.py +0 -0
  64. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/__init__.py +0 -0
  65. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/alt/__init__.py +0 -0
  66. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/alt/app_engine.py +0 -0
  67. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/alt/appengine.py +0 -0
  68. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/__init__.py +0 -0
  69. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/audit/__init__.py +0 -0
  70. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/audit/service.py +0 -0
  71. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  72. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/contacts/service.py +0 -0
  73. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/apps/service.py +0 -0
  74. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/service.py +0 -0
  75. {gam7-7.9.4 → gam7-7.9.6}/src/gam/gdata/urlfetch.py +0 -0
  76. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/__init__.py +0 -0
  77. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/_auth.py +0 -0
  78. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/_helpers.py +0 -0
  79. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/channel.py +0 -0
  80. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/discovery.py +0 -0
  81. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  82. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  83. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  84. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  85. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/errors.py +0 -0
  86. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/http.py +0 -0
  87. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/mimeparse.py +0 -0
  88. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/model.py +0 -0
  89. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/schema.py +0 -0
  90. {gam7-7.9.4 → gam7-7.9.6}/src/gam/googleapiclient/version.py +0 -0
  91. {gam7-7.9.4 → gam7-7.9.6}/src/gam/iso8601/__init__.py +0 -0
  92. {gam7-7.9.4 → gam7-7.9.6}/src/gam/iso8601/iso8601.py +0 -0
  93. {gam7-7.9.4 → gam7-7.9.6}/src/gam/meet-v2beta.json +0 -0
  94. {gam7-7.9.4 → gam7-7.9.6}/src/gam/serviceaccountlookup-v1.json +0 -0
  95. {gam7-7.9.4 → gam7-7.9.6}/src/gam/six.py +0 -0
  96. {gam7-7.9.4 → gam7-7.9.6}/src/gam-install.sh +0 -0
  97. {gam7-7.9.4 → gam7-7.9.6}/src/gam-setup.bat +0 -0
  98. {gam7-7.9.4 → gam7-7.9.6}/src/gam.exe.manifest +0 -0
  99. {gam7-7.9.4 → gam7-7.9.6}/src/gam.py +0 -0
  100. {gam7-7.9.4 → gam7-7.9.6}/src/gam.spec +0 -0
  101. {gam7-7.9.4 → gam7-7.9.6}/src/gam.wxs +0 -0
  102. {gam7-7.9.4 → gam7-7.9.6}/src/license.rtf +0 -0
  103. {gam7-7.9.4 → gam7-7.9.6}/src/requirements-dev.txt +0 -0
  104. {gam7-7.9.4 → gam7-7.9.6}/src/requirements.txt +0 -0
  105. {gam7-7.9.4 → gam7-7.9.6}/src/setup.cfg +0 -0
  106. {gam7-7.9.4 → gam7-7.9.6}/src/setup.py +0 -0
  107. {gam7-7.9.4 → gam7-7.9.6}/src/tools/a_atleast_b.py +0 -0
  108. {gam7-7.9.4 → gam7-7.9.6}/src/tools/gen-wix-xml-filelist.py +0 -0
  109. {gam7-7.9.4 → gam7-7.9.6}/src/tools/mkGamRef.py +0 -0
  110. {gam7-7.9.4 → gam7-7.9.6}/src/tools/openssl.props +0 -0
  111. {gam7-7.9.4 → gam7-7.9.6}/src/version_info.txt.in +0 -0
  112. {gam7-7.9.4 → gam7-7.9.6}/wiki/00scratch.md +0 -0
  113. {gam7-7.9.4 → gam7-7.9.6}/wiki/Addresses.md +0 -0
  114. {gam7-7.9.4 → gam7-7.9.6}/wiki/Administrators.md +0 -0
  115. {gam7-7.9.4 → gam7-7.9.6}/wiki/Alert-Center.md +0 -0
  116. {gam7-7.9.4 → gam7-7.9.6}/wiki/Aliases.md +0 -0
  117. {gam7-7.9.4 → gam7-7.9.6}/wiki/Authorization.md +0 -0
  118. {gam7-7.9.4 → gam7-7.9.6}/wiki/BNF-Syntax.md +0 -0
  119. {gam7-7.9.4 → gam7-7.9.6}/wiki/Basic-Items.md +0 -0
  120. {gam7-7.9.4 → gam7-7.9.6}/wiki/Bulk-Processing.md +0 -0
  121. {gam7-7.9.4 → gam7-7.9.6}/wiki/CSV-Input-Filtering.md +0 -0
  122. {gam7-7.9.4 → gam7-7.9.6}/wiki/CSV-Output-Filtering.md +0 -0
  123. {gam7-7.9.4 → gam7-7.9.6}/wiki/CSV-Special-Characters.md +0 -0
  124. {gam7-7.9.4 → gam7-7.9.6}/wiki/Calendars-Access.md +0 -0
  125. {gam7-7.9.4 → gam7-7.9.6}/wiki/Calendars-Events.md +0 -0
  126. {gam7-7.9.4 → gam7-7.9.6}/wiki/Calendars.md +0 -0
  127. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chat-Bot.md +0 -0
  128. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-AUE-Counts.md +0 -0
  129. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  130. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Installed-Apps.md +0 -0
  131. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  132. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Printers.md +0 -0
  133. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Profile-Management.md +0 -0
  134. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Version-Counts.md +0 -0
  135. {gam7-7.9.4 → gam7-7.9.6}/wiki/Chrome-Version-History.md +0 -0
  136. {gam7-7.9.4 → gam7-7.9.6}/wiki/ChromeOS-Devices.md +0 -0
  137. {gam7-7.9.4 → gam7-7.9.6}/wiki/Classroom-Courses.md +0 -0
  138. {gam7-7.9.4 → gam7-7.9.6}/wiki/Classroom-Guardians.md +0 -0
  139. {gam7-7.9.4 → gam7-7.9.6}/wiki/Classroom-Invitations.md +0 -0
  140. {gam7-7.9.4 → gam7-7.9.6}/wiki/Classroom-Membership.md +0 -0
  141. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Channel.md +0 -0
  142. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Identity-Devices.md +0 -0
  143. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  144. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Identity-Groups.md +0 -0
  145. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Identity-Policies.md +0 -0
  146. {gam7-7.9.4 → gam7-7.9.6}/wiki/Cloud-Storage.md +0 -0
  147. {gam7-7.9.4 → gam7-7.9.6}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  148. {gam7-7.9.4 → gam7-7.9.6}/wiki/Collections-of-Items.md +0 -0
  149. {gam7-7.9.4 → gam7-7.9.6}/wiki/Collections-of-Users.md +0 -0
  150. {gam7-7.9.4 → gam7-7.9.6}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  151. {gam7-7.9.4 → gam7-7.9.6}/wiki/Command-Line-Parsing.md +0 -0
  152. {gam7-7.9.4 → gam7-7.9.6}/wiki/Command-Logging-Progress.md +0 -0
  153. {gam7-7.9.4 → gam7-7.9.6}/wiki/Context-Aware-Access-Levels.md +0 -0
  154. {gam7-7.9.4 → gam7-7.9.6}/wiki/Customer.md +0 -0
  155. {gam7-7.9.4 → gam7-7.9.6}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  156. {gam7-7.9.4 → gam7-7.9.6}/wiki/Domain-SharedContacts.md +0 -0
  157. {gam7-7.9.4 → gam7-7.9.6}/wiki/Domains-Verification.md +0 -0
  158. {gam7-7.9.4 → gam7-7.9.6}/wiki/Domains.md +0 -0
  159. {gam7-7.9.4 → gam7-7.9.6}/wiki/Downloads-Installs.md +0 -0
  160. {gam7-7.9.4 → gam7-7.9.6}/wiki/Drive-File-Selection.md +0 -0
  161. {gam7-7.9.4 → gam7-7.9.6}/wiki/Drive-Items.md +0 -0
  162. {gam7-7.9.4 → gam7-7.9.6}/wiki/Drive-REST-API-v3.md +0 -0
  163. {gam7-7.9.4 → gam7-7.9.6}/wiki/Email-Audit-Monitor.md +0 -0
  164. {gam7-7.9.4 → gam7-7.9.6}/wiki/Find-File-Owner.md +0 -0
  165. {gam7-7.9.4 → gam7-7.9.6}/wiki/GAM-Public-Chat-Room.md +0 -0
  166. {gam7-7.9.4 → gam7-7.9.6}/wiki/GAM-Return-Codes.md +0 -0
  167. {gam7-7.9.4 → gam7-7.9.6}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  168. {gam7-7.9.4 → gam7-7.9.6}/wiki/GAM7-on-Android-Devices.md +0 -0
  169. {gam7-7.9.4 → gam7-7.9.6}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  170. {gam7-7.9.4 → gam7-7.9.6}/wiki/Google-Data-Transfers.md +0 -0
  171. {gam7-7.9.4 → gam7-7.9.6}/wiki/Google-Network-Addresses.md +0 -0
  172. {gam7-7.9.4 → gam7-7.9.6}/wiki/Groups-Membership.md +0 -0
  173. {gam7-7.9.4 → gam7-7.9.6}/wiki/Groups.md +0 -0
  174. {gam7-7.9.4 → gam7-7.9.6}/wiki/HTTPS-Proxy.md +0 -0
  175. {gam7-7.9.4 → gam7-7.9.6}/wiki/Home.md +0 -0
  176. {gam7-7.9.4 → gam7-7.9.6}/wiki/How-to-Install-GAM7.md +0 -0
  177. {gam7-7.9.4 → gam7-7.9.6}/wiki/How-to-Uninstall-GAM7.md +0 -0
  178. {gam7-7.9.4 → gam7-7.9.6}/wiki/How-to-Update-GAM7.md +0 -0
  179. {gam7-7.9.4 → gam7-7.9.6}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  180. {gam7-7.9.4 → gam7-7.9.6}/wiki/Inbound-SSO.md +0 -0
  181. {gam7-7.9.4 → gam7-7.9.6}/wiki/Install-GAM-as-Python-Library.md +0 -0
  182. {gam7-7.9.4 → gam7-7.9.6}/wiki/Licenses.md +0 -0
  183. {gam7-7.9.4 → gam7-7.9.6}/wiki/List-Items.md +0 -0
  184. {gam7-7.9.4 → gam7-7.9.6}/wiki/List.md +0 -0
  185. {gam7-7.9.4 → gam7-7.9.6}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  186. {gam7-7.9.4 → gam7-7.9.6}/wiki/Mobile-Devices.md +0 -0
  187. {gam7-7.9.4 → gam7-7.9.6}/wiki/Organizational-Units.md +0 -0
  188. {gam7-7.9.4 → gam7-7.9.6}/wiki/Other-Resources.md +0 -0
  189. {gam7-7.9.4 → gam7-7.9.6}/wiki/Permission-Matches.md +0 -0
  190. {gam7-7.9.4 → gam7-7.9.6}/wiki/Python-Regular-Expressions.md +0 -0
  191. {gam7-7.9.4 → gam7-7.9.6}/wiki/README.md +0 -0
  192. {gam7-7.9.4 → gam7-7.9.6}/wiki/Rclone.md +0 -0
  193. {gam7-7.9.4 → gam7-7.9.6}/wiki/Reports.md +0 -0
  194. {gam7-7.9.4 → gam7-7.9.6}/wiki/Reseller.md +0 -0
  195. {gam7-7.9.4 → gam7-7.9.6}/wiki/Resources.md +0 -0
  196. {gam7-7.9.4 → gam7-7.9.6}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  197. {gam7-7.9.4 → gam7-7.9.6}/wiki/SSL-Root-CA-Certificates.md +0 -0
  198. {gam7-7.9.4 → gam7-7.9.6}/wiki/Schemas.md +0 -0
  199. {gam7-7.9.4 → gam7-7.9.6}/wiki/Scripts.md +0 -0
  200. {gam7-7.9.4 → gam7-7.9.6}/wiki/Send-Email.md +0 -0
  201. {gam7-7.9.4 → gam7-7.9.6}/wiki/Shared-Drives.md +0 -0
  202. {gam7-7.9.4 → gam7-7.9.6}/wiki/Sites.md +0 -0
  203. {gam7-7.9.4 → gam7-7.9.6}/wiki/Tag-Replace.md +0 -0
  204. {gam7-7.9.4 → gam7-7.9.6}/wiki/Todrive.md +0 -0
  205. {gam7-7.9.4 → gam7-7.9.6}/wiki/Unmanaged-Accounts.md +0 -0
  206. {gam7-7.9.4 → gam7-7.9.6}/wiki/Upgrade-Benefits.md +0 -0
  207. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Analytics-Admin.md +0 -0
  208. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Application-Specific-Passwords.md +0 -0
  209. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Backup-Verification-Codes.md +0 -0
  210. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Calendars-Access.md +0 -0
  211. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Calendars-Events.md +0 -0
  212. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Calendars.md +0 -0
  213. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Chat.md +0 -0
  214. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Classification-Labels.md +0 -0
  215. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Classroom-Profile.md +0 -0
  216. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Contacts-Delegates.md +0 -0
  217. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Contacts.md +0 -0
  218. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Deprovision.md +0 -0
  219. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Activity-Settings.md +0 -0
  220. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Cleanup.md +0 -0
  221. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Comments.md +0 -0
  222. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Copy-Move.md +0 -0
  223. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Files-Display.md +0 -0
  224. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Files-Manage.md +0 -0
  225. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Orphans.md +0 -0
  226. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Ownership.md +0 -0
  227. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Permissions.md +0 -0
  228. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Query.md +0 -0
  229. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Revisions.md +0 -0
  230. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Shortcuts.md +0 -0
  231. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Drive-Transfer.md +0 -0
  232. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Forms.md +0 -0
  233. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-CSE.md +0 -0
  234. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Delegates.md +0 -0
  235. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Filters.md +0 -0
  236. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Forwarding.md +0 -0
  237. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Labels.md +0 -0
  238. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  239. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Profile.md +0 -0
  240. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-S-MIME.md +0 -0
  241. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  242. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Gmail-Settings.md +0 -0
  243. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Group-Membership.md +0 -0
  244. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Keep-Notes.md +0 -0
  245. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Looker-Studio.md +0 -0
  246. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Meet.md +0 -0
  247. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-People-Contacts-Profiles.md +0 -0
  248. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Photo.md +0 -0
  249. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Profile-Photo.md +0 -0
  250. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Profile-Sharing.md +0 -0
  251. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Shared-Drives.md +0 -0
  252. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  253. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Spreadsheets.md +0 -0
  254. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Tasks.md +0 -0
  255. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-Tokens.md +0 -0
  256. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users-YouTube.md +0 -0
  257. {gam7-7.9.4 → gam7-7.9.6}/wiki/Users.md +0 -0
  258. {gam7-7.9.4 → gam7-7.9.6}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  259. {gam7-7.9.4 → gam7-7.9.6}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  260. {gam7-7.9.4 → gam7-7.9.6}/wiki/Vault-Takeout.md +0 -0
  261. {gam7-7.9.4 → gam7-7.9.6}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  262. {gam7-7.9.4 → gam7-7.9.6}/wiki/_Sidebar.md +0 -0
  263. {gam7-7.9.4 → gam7-7.9.6}/wiki/gam.cfg.md +0 -0
  264. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Home.md +0 -0
  303. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Printers.md +0 -0
  312. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.9.4 → gam7-7.9.6}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.9.4
3
+ Version: 7.9.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
@@ -5031,18 +5031,18 @@ gam <UserTypeEntity> delete permissions <SharedDriveEntityAdmin> <DriveFilePermi
5031
5031
 
5032
5032
  In these commands, the Google administrator named in oauth2.txt is used.
5033
5033
 
5034
- gam copy teamdriveacls <SharedDriveEntity> to <SharedDriveEntity>
5034
+ gam copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
5035
5035
  [adminaccess|asadmin]
5036
5036
  [showpermissionsmessages [<Boolean>]]
5037
5037
  [excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
5038
5038
  (mappermissionsdomain <DomainName> <DomainName>)*
5039
- gam sync teamdriveacls <SharedDriveEntity> with <SharedDriveEntity>
5039
+ gam sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
5040
5040
  [adminaccess|asadmin]
5041
5041
  [showpermissionsmessages [<Boolean>]]
5042
5042
  [excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
5043
5043
  (mappermissionsdomain <DomainName> <DomainName>)*
5044
5044
 
5045
- gam print teamdriveacls [todrive <ToDriveAttribute>*]
5045
+ gam print shareddriveacls [todrive <ToDriveAttribute>*]
5046
5046
  [teamdriveadminquery|query <QueryTeamDrive>]
5047
5047
  [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
5048
5048
  [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
@@ -5050,7 +5050,7 @@ gam print teamdriveacls [todrive <ToDriveAttribute>*]
5050
5050
  [oneitemperrow] [<DrivePermissionsFieldName>*|(fields <DrivePermissionsFieldNameList>)]
5051
5051
  (addcsvdata <FieldName> <String>)*
5052
5052
  [formatjson [quotechar <Character>]]
5053
- gam show teamdriveacls
5053
+ gam show shareddriveacls
5054
5054
  [teamdriveadminquery|query <QueryTeamDrive>]
5055
5055
  [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
5056
5056
  [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
@@ -5060,18 +5060,18 @@ gam show teamdriveacls
5060
5060
 
5061
5061
  In these commands, you specify an administrator and then indicate that you want domain administrator access with the adminaccess option.
5062
5062
 
5063
- gam <UserTypeEntity> copy teamdriveacls <SharedDriveEntity> to <SharedDriveEntity>
5063
+ gam <UserTypeEntity> copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
5064
5064
  [adminaccess|asadmin]
5065
5065
  [showpermissionsmessages [<Boolean>]]
5066
5066
  [excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
5067
5067
  (mappermissionsdomain <DomainName> <DomainName>)*
5068
- gam <UserTypeEntity> sync teamdriveacls <SharedDriveEntity> with <SharedDriveEntity>
5068
+ gam <UserTypeEntity> sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
5069
5069
  [adminaccess|asadmin]
5070
5070
  [showpermissionsmessages [<Boolean>]]
5071
5071
  [excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
5072
5072
  (mappermissionsdomain <DomainName> <DomainName>)*
5073
5073
 
5074
- gam <UserTypeEntity> print teamdriveacls [todrive <ToDriveAttribute>*]
5074
+ gam <UserTypeEntity> print shareddriveacls [todrive <ToDriveAttribute>*]
5075
5075
  [adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>]
5076
5076
  [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
5077
5077
  [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
@@ -5080,7 +5080,7 @@ gam <UserTypeEntity> print teamdriveacls [todrive <ToDriveAttribute>*]
5080
5080
  [shownopermissionsdrives false|true|only]
5081
5081
  (addcsvdata <FieldName> <String>)*
5082
5082
  [formatjson [quotechar <Character>]]
5083
- gam <UserTypeEntity> show teamdriveacls
5083
+ gam <UserTypeEntity> show shareddriveacls
5084
5084
  [adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>]
5085
5085
  [matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
5086
5086
  [user|group <EmailAddress> [checkgroups]] (role|roles <SharedDriveACLRoleList>)*
@@ -1,3 +1,14 @@
1
+ 7.09.06
2
+
3
+ Upddated `gam print|show shareddrives', `gam print|show shareddriveacls', `gam print shareddriveorganizers`
4
+ to display the Shared Drives in ascending name order; the API returns them in an unidentifiable order.
5
+
6
+ 7.09.05
7
+
8
+ Improved output of `gam info|show chromeschemas [std]` to more accurately display the schemas.
9
+
10
+ Fixed bugs in `gam update chromepolicy` that caused invalid error messaages.
11
+
1
12
  7.09.04
2
13
 
3
14
  Fixed bug in `gam whatis <EmailItem>` where the check for an invitable user always failed.
@@ -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.09.04'
28
+ __version__ = '7.09.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
@@ -12353,7 +12353,8 @@ def checkServiceAccount(users):
12353
12353
  Ind.Increment()
12354
12354
  try:
12355
12355
  key = callGAPI(iam.projects().serviceAccounts().keys(), 'get',
12356
- throwReasons=[GAPI.BAD_REQUEST, GAPI.INVALID, GAPI.NOT_FOUND, GAPI.PERMISSION_DENIED],
12356
+ throwReasons=[GAPI.BAD_REQUEST, GAPI.INVALID, GAPI.NOT_FOUND,
12357
+ GAPI.PERMISSION_DENIED, GAPI.SERVICE_NOT_AVAILABLE],
12357
12358
  name=name, fields='validAfterTime')
12358
12359
  key_created, _ = iso8601.parse_date(key['validAfterTime'])
12359
12360
  key_age = todaysTime()-key_created
@@ -12366,6 +12367,10 @@ def checkServiceAccount(users):
12366
12367
  Ent.SVCACCT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['client_email']],
12367
12368
  str(e))
12368
12369
  printPassFail(Msg.SERVICE_ACCOUNT_PRIVATE_KEY_AGE.format('UNKNOWN'), testWarn)
12370
+ except GAPI.serviceNotAvailable as e:
12371
+ entityActionFailedExit([Ent.PROJECT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['project_id'],
12372
+ Ent.SVCACCT, GM.Globals[GM.OAUTH2SERVICE_JSON_DATA]['client_email']],
12373
+ str(e))
12369
12374
  else:
12370
12375
  printPassFail(Msg.SERVICE_ACCOUNT_SKIPPING_KEY_AGE_CHECK.format(key_type), testPass)
12371
12376
  Ind.Decrement()
@@ -28111,27 +28116,21 @@ def commonprefix(m):
28111
28116
  return s1[:i]
28112
28117
  return s1
28113
28118
 
28114
- def simplifyChromeSchema(schema):
28119
+ SCHEMA_TYPE_MESSAGE_MAP = {
28120
+ 'NullableDuration': {'type': 'TYPE_INT64', 'namedType': 'duration'},
28121
+ 'NullableLong': {'type': 'TYPE_INT64', 'namedType': 'value'},
28122
+ 'SystemTimezone': {'type': 'TYPE_STRING', 'namedType': 'value'}
28123
+ }
28124
+
28125
+ def simplifyChromeSchemaUpdate(schema):
28115
28126
  schema_name = schema['name'].split('/')[-1]
28116
- schema_dict = {'name': schema_name,
28117
- 'description': schema.get('policyDescription', ''),
28118
- 'settings': {}
28119
- }
28120
- fieldDescriptions = schema['fieldDescriptions']
28121
- savedSettingName = ''
28122
- savedTypeName = ''
28127
+ schema_dict = {'name': schema_name, 'settings': {}}
28123
28128
  for mtype in schema['definition']['messageType']:
28124
- numSettings = len(mtype['field'])
28129
+ if mtype['name'] in SCHEMA_TYPE_MESSAGE_MAP:
28130
+ continue
28125
28131
  for setting in mtype['field']:
28126
28132
  setting_name = setting['name']
28127
- setting_dict = {'name': setting_name,
28128
- 'constraints': None,
28129
- 'descriptions': [],
28130
- 'type': setting['type'],
28131
- }
28132
- if mtype['name'] == savedTypeName and numSettings == 1:
28133
- setting_dict['name'] = savedSettingName
28134
- savedTypeName = ''
28133
+ setting_dict = {'name': setting_name, 'type': setting['type'], 'namedType': ''}
28135
28134
  if setting_dict['type'] == 'TYPE_STRING' and setting.get('label') == 'LABEL_REPEATED':
28136
28135
  setting_dict['type'] = 'TYPE_LIST'
28137
28136
  if setting_dict['type'] == 'TYPE_ENUM':
@@ -28142,29 +28141,83 @@ def simplifyChromeSchema(schema):
28142
28141
  setting_dict['enum_prefix'] = commonprefix(setting_dict['enums'])
28143
28142
  prefix_len = len(setting_dict['enum_prefix'])
28144
28143
  setting_dict['enums'] = [enum[prefix_len:] for enum in setting_dict['enums'] if not enum.endswith('UNSPECIFIED')]
28145
- setting_dict['descriptions'] = ['']*len(setting_dict['enums'])
28146
- for i, an in enumerate(setting_dict['enums']):
28144
+ elif setting_dict['type'] == 'TYPE_MESSAGE':
28145
+ type_name = setting['typeName']
28146
+ if type_name not in SCHEMA_TYPE_MESSAGE_MAP:
28147
+ continue
28148
+ setting_dict['type'] = SCHEMA_TYPE_MESSAGE_MAP[type_name]['type']
28149
+ setting_dict['namedType'] = SCHEMA_TYPE_MESSAGE_MAP[type_name]['namedType']
28150
+ schema_dict['settings'][setting_name.lower()] = setting_dict
28151
+ return(schema_name, schema_dict)
28152
+
28153
+ def simplifyChromeSchemaDisplay(schema):
28154
+ schema_name = schema['name'].split('/')[-1]
28155
+ schema_dict = {'name': schema_name, 'description': schema.get('policyDescription', '')}
28156
+ fieldDescriptions = schema['fieldDescriptions']
28157
+ enumDict = {}
28158
+ for enumType in schema['definition'].get('enumType', []):
28159
+ enumEntry = {}
28160
+ enumEntry['enums'] = [enum['name'] for enum in enumType['value']]
28161
+ enumEntry['enum_prefix'] = commonprefix(enumEntry['enums'])
28162
+ enumEntry['enum_prefix_len'] = prefix_len = len(enumEntry['enum_prefix'])
28163
+ enumEntry['enums'] = [enum[prefix_len:] for enum in enumEntry['enums'] if not enum.endswith('UNSPECIFIED')]
28164
+ enumDict[enumType['name']] = enumEntry.copy()
28165
+ mesgDict = {}
28166
+ mesgPops = set()
28167
+ for mesgType in schema['definition']['messageType']:
28168
+ mtypeEntry = {'field': {}, 'subfield': False}
28169
+ for mfield in mesgType['field']:
28170
+ mfield.pop('number')
28171
+ mtypeEntry['field'][mfield.pop('name')] = mfield
28172
+ mesgDict[mesgType['name']] = mtypeEntry.copy()
28173
+ for _, mtypeEntry in mesgDict.items():
28174
+ for mfieldName, mfield in mtypeEntry['field'].items():
28175
+ mfield['descriptions'] = []
28176
+ if mfield['type'] == 'TYPE_STRING' and mfield.get('label') == 'LABEL_REPEATED':
28177
+ mfield['type'] = 'TYPE_LIST'
28178
+ if mfield['type'] == 'TYPE_ENUM':
28179
+ mfield['subtype'] = enumDict[mfield['typeName']]
28180
+ for an_enum in schema['definition']['enumType']:
28181
+ if an_enum['name'] == mfield['typeName']:
28182
+ mfield['descriptions'] = ['']*len(mfield['subtype']['enums'])
28183
+ for i, an in enumerate(mfield['subtype']['enums']):
28147
28184
  for fdesc in fieldDescriptions:
28148
- if fdesc.get('field') == setting_name:
28185
+ if fdesc.get('field') == mfieldName:
28149
28186
  for d in fdesc.get('knownValueDescriptions', []):
28150
- if d['value'][prefix_len:] == an:
28151
- setting_dict['descriptions'][i] = d.get('description', '')
28187
+ if d['value'][mfield['subtype']['enum_prefix_len']:] == an:
28188
+ mfield['descriptions'][i] = d.get('description', '')
28152
28189
  break
28153
28190
  break
28154
28191
  break
28155
- elif setting_dict['type'] == 'TYPE_MESSAGE':
28156
- savedSettingName = setting_name
28157
- savedTypeName = setting['typeName']
28192
+ elif mfield['type'] == 'TYPE_MESSAGE':
28193
+ subfield = mfield['typeName']
28194
+ if subfield not in SCHEMA_TYPE_MESSAGE_MAP:
28195
+ mesgDict[subfield]['subfield'] = True
28196
+ mfield['subtype'] = mesgDict[subfield]
28197
+ else:
28198
+ mfield['type'] = SCHEMA_TYPE_MESSAGE_MAP[subfield]['type']
28199
+ mesgPops.add(subfield)
28158
28200
  continue
28159
28201
  else:
28160
- setting_dict['enums'] = None
28161
- for fdesc in schema['fieldDescriptions']:
28162
- if fdesc['field'] == setting_name:
28202
+ for fdesc in fieldDescriptions:
28203
+ if fdesc['field'] == mfieldName:
28163
28204
  if 'knownValueDescriptions' in fdesc:
28164
- setting_dict['descriptions'] = fdesc['knownValueDescriptions']
28205
+ if isinstance(fdesc['knownValueDescriptions'], list):
28206
+ for kvd in fdesc['knownValueDescriptions']:
28207
+ if isinstance(kvd, dict):
28208
+ if 'description' in kvd:
28209
+ mfield['descriptions'].append(f"{kvd['value']}: {kvd['description']}")
28210
+ else:
28211
+ mfield['descriptions'].append(f"{kvd['value']}")
28212
+ else:
28213
+ mfield['descriptions'].extend(kvd)
28214
+ else:
28215
+ mfield['descriptions'].append(kvd)
28165
28216
  elif 'description' in fdesc:
28166
- setting_dict['descriptions'] = [fdesc['description']]
28167
- schema_dict['settings'][setting_name.lower()] = setting_dict
28217
+ mfield['descriptions'].append(fdesc['description'])
28218
+ for pfield in mesgPops:
28219
+ mesgDict.pop(pfield)
28220
+ schema_dict['settings'] = mesgDict
28168
28221
  return(schema_name, schema_dict)
28169
28222
 
28170
28223
  def _getPolicyOrgUnitTarget(cd, cp, myarg, groupEmail):
@@ -28507,7 +28560,7 @@ def doUpdateChromePolicy():
28507
28560
  elif myarg == 'convertcrnl':
28508
28561
  convertCRsNLs = True
28509
28562
  else:
28510
- schemaName, schema = simplifyChromeSchema(_getChromePolicySchema(cp, Cmd.Previous(), '*'))
28563
+ schemaName, schema = simplifyChromeSchemaUpdate(_getChromePolicySchema(cp, Cmd.Previous(), '*'))
28511
28564
  body['requests'].append({'policyValue': {'policySchema': schemaName, 'value': {}},
28512
28565
  'updateMask': ''})
28513
28566
  schemaNameList.append(schemaName)
@@ -28593,8 +28646,9 @@ def doUpdateChromePolicy():
28593
28646
  if field not in schema['settings']:
28594
28647
  Cmd.Backup()
28595
28648
  missingChoiceExit(schema['settings'])
28596
- casedField = schema['settings'][field]['name']
28597
- vtype = schema['settings'][field]['type']
28649
+ field_settings = schema['settings'][field]
28650
+ casedField = field_settings['name']
28651
+ vtype = field_settings['type']
28598
28652
  value = getString(Cmd.OB_STRING, minLen=0 if vtype in {'TYPE_STRING', 'TYPE_LIST'} else 1)
28599
28653
  if vtype in ['TYPE_INT64', 'TYPE_INT32', 'TYPE_UINT64']:
28600
28654
  if not value.isnumeric():
@@ -28611,8 +28665,8 @@ def doUpdateChromePolicy():
28611
28665
  invalidChoiceExit(value, TRUE_FALSE, True)
28612
28666
  elif vtype == 'TYPE_ENUM':
28613
28667
  value = value.upper()
28614
- prefix = schema['settings'][field]['enum_prefix']
28615
- enum_values = schema['settings'][field]['enums']
28668
+ prefix = field_settings['enum_prefix']
28669
+ enum_values = field_settings['enums']
28616
28670
  if value in enum_values:
28617
28671
  value = f'{prefix}{value}'
28618
28672
  elif value.replace(prefix, '') in enum_values:
@@ -28639,7 +28693,10 @@ def doUpdateChromePolicy():
28639
28693
  elif value and not CHROME_TARGET_VERSION_PATTERN.match(value):
28640
28694
  Cmd.Backup()
28641
28695
  invalidArgumentExit(Msg.CHROME_TARGET_VERSION_FORMAT)
28642
- body['requests'][-1]['policyValue']['value'][casedField] = value
28696
+ if field_settings['namedType']:
28697
+ body['requests'][-1]['policyValue']['value'][casedField] = {field_settings['namedType']: value}
28698
+ else:
28699
+ body['requests'][-1]['policyValue']['value'][casedField] = value
28643
28700
  body['requests'][-1]['updateMask'] += f'{casedField},'
28644
28701
  checkPolicyArgs(targetResource, printer_id, app_id)
28645
28702
  count = len(body['requests'])
@@ -28940,7 +28997,9 @@ def _showChromePolicySchema(schema, FJQC, i=0, count=0):
28940
28997
  return
28941
28998
  printEntity([Ent.CHROME_POLICY_SCHEMA, schema['name']], i, count)
28942
28999
  Ind.Increment()
28943
- showJSON(None, schema, dictObjectsKey={'messageType': 'name', 'field': 'name', 'fieldDescriptions': 'field'})
29000
+ showJSON(None, schema,
29001
+ dictObjectsKey={'messageType': 'name', 'field': 'name',
29002
+ 'fieldDescriptions': 'field', 'knownValueDescriptions': 'value'})
28944
29003
  Ind.Decrement()
28945
29004
 
28946
29005
  CHROME_POLICY_SCHEMA_FIELDS_CHOICE_MAP = {
@@ -29074,31 +29133,35 @@ def doPrintShowChromePolicySchemas():
29074
29133
  csvPF.writeCSVfile('Chrome Policy Schemas')
29075
29134
 
29076
29135
  def _showChromePolicySchemaStd(schema):
29077
- printKeyValueList([f'{schema.get("name")}', f'{schema.get("description")}'])
29078
- Ind.Increment()
29079
- for val in schema['settings'].values():
29080
- vtype = val.get('type')
29081
- printKeyValueList([f'{val.get("name")}', f'{vtype}'])
29136
+ def _printEntry(mtypeName, mtypeEntry):
29137
+ vtype = mtypeEntry['type']
29138
+ if vtype != 'TYPE_MESSAGE':
29139
+ printKeyValueList([f'{mtypeName}', f'{vtype}'])
29140
+ else:
29141
+ printKeyValueList([f'{mtypeName}'])
29082
29142
  Ind.Increment()
29083
29143
  if vtype == 'TYPE_ENUM':
29084
- enums = val.get('enums', [])
29085
- descriptions = val.get('descriptions', [])
29086
- for i in range(len(val.get('enums', []))):
29144
+ enums = mtypeEntry['subtype']['enums']
29145
+ descriptions = mtypeEntry['descriptions']
29146
+ for i in range(len(enums)):
29087
29147
  printKeyValueList([f'{enums[i]}', f'{descriptions[i]}'])
29088
- elif vtype == 'TYPE_BOOL':
29089
- pvs = val.get('descriptions')
29090
- for pvi in pvs:
29091
- if isinstance(pvi, dict):
29092
- pvalue = pvi.get('value')
29093
- pdescription = pvi.get('description')
29094
- printKeyValueList([f'{pvalue}', f'{pdescription}'])
29095
- elif isinstance(pvi, list):
29096
- printKeyValueList([f'{pvi[0]}'])
29097
- else:
29098
- description = val.get('descriptions')
29099
- if len(description) > 0:
29100
- printKeyValueList([f'{description[0]}'])
29148
+ elif vtype == 'TYPE_MESSAGE':
29149
+ for mfieldName, mfield in mtypeEntry['subtype']['field'].items():
29150
+ # managedBookmarks is recursive
29151
+ if mtypeName != 'entries':
29152
+ _printEntry(mfieldName, mfield)
29153
+ else:
29154
+ for description in mtypeEntry.get('descriptions', []):
29155
+ printKeyValueList([description])
29101
29156
  Ind.Decrement()
29157
+
29158
+ printKeyValueList([f'{schema.get("name")}', f'{schema.get("description")}'])
29159
+ Ind.Increment()
29160
+ for _, mtypeEntry in schema['settings'].items():
29161
+ if mtypeEntry['subfield']:
29162
+ continue
29163
+ for mfieldName, mfield in mtypeEntry['field'].items():
29164
+ _printEntry(mfieldName, mfield)
29102
29165
  Ind.Decrement()
29103
29166
 
29104
29167
  # gam info chromeschema std <SchemaName>
@@ -29109,7 +29172,7 @@ def doInfoChromePolicySchemasStd(cp):
29109
29172
  schema = callGAPI(cp.customers().policySchemas(), 'get',
29110
29173
  throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN],
29111
29174
  name=name)
29112
- _, schema_dict = simplifyChromeSchema(schema)
29175
+ _, schema_dict = simplifyChromeSchemaDisplay(schema)
29113
29176
  _showChromePolicySchemaStd(schema_dict)
29114
29177
  except GAPI.notFound:
29115
29178
  entityUnknownWarning(Ent.CHROME_POLICY_SCHEMA, name)
@@ -29131,7 +29194,7 @@ def doShowChromePolicySchemasStd(cp):
29131
29194
  parent=parent, filter=sfilter)
29132
29195
  schemas = {}
29133
29196
  for schema in result:
29134
- schema_name, schema_dict = simplifyChromeSchema(schema)
29197
+ schema_name, schema_dict = simplifyChromeSchemaDisplay(schema)
29135
29198
  schemas[schema_name.lower()] = schema_dict
29136
29199
  for _, schema in sorted(iter(schemas.items())):
29137
29200
  _showChromePolicySchemaStd(schema)
@@ -65712,13 +65775,13 @@ def printShowSharedDrives(users, useDomainAdminAccess=False):
65712
65775
  entityPerformActionNumItems([Ent.USER, user], jcount, Ent.SHAREDDRIVE, i, count)
65713
65776
  Ind.Increment()
65714
65777
  j = 0
65715
- for shareddrive in matchedFeed:
65778
+ for shareddrive in sorted(matchedFeed, key=lambda k: k['name']):
65716
65779
  j += 1
65717
65780
  shareddrive = stripNonShowFields(shareddrive)
65718
65781
  _showSharedDrive(user, shareddrive, j, jcount, FJQC)
65719
65782
  Ind.Decrement()
65720
65783
  else:
65721
- for shareddrive in matchedFeed:
65784
+ for shareddrive in sorted(matchedFeed, key=lambda k: k['name']):
65722
65785
  shareddrive = stripNonShowFields(shareddrive)
65723
65786
  if FJQC.formatJSON:
65724
65787
  row = {'User': user, 'id': shareddrive['id'], 'name': shareddrive['name']}
@@ -66093,7 +66156,7 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False):
66093
66156
  entityPerformActionNumItems([Ent.USER, user], jcount, Ent.SHAREDDRIVE, i, count)
66094
66157
  Ind.Increment()
66095
66158
  j = 0
66096
- for shareddrive in matchFeed:
66159
+ for shareddrive in sorted(matchFeed, key=lambda k: k['name']):
66097
66160
  j += 1
66098
66161
  if not FJQC.formatJSON:
66099
66162
  _showDriveFilePermissions(Ent.SHAREDDRIVE, f'{shareddrive["name"]} ({shareddrive["id"]}) - {shareddrive["createdTime"]}',
@@ -66107,7 +66170,7 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False):
66107
66170
  Ind.Decrement()
66108
66171
  elif matchFeed:
66109
66172
  if oneItemPerRow:
66110
- for shareddrive in matchFeed:
66173
+ for shareddrive in sorted(matchFeed, key=lambda k: k['name']):
66111
66174
  baserow = {'User': user, 'id': shareddrive['id'], 'name': shareddrive['name'], 'createdTime': shareddrive['createdTime']}
66112
66175
  if addCSVData:
66113
66176
  baserow.update(addCSVData)
@@ -66128,7 +66191,7 @@ def printShowSharedDriveACLs(users, useDomainAdminAccess=False):
66128
66191
  baserow['JSON'] = json.dumps({})
66129
66192
  csvPF.WriteRowNoFilter(baserow)
66130
66193
  else:
66131
- for shareddrive in matchFeed:
66194
+ for shareddrive in sorted(matchFeed, key=lambda k: k['name']):
66132
66195
  baserow = {'User': user, 'id': shareddrive['id'], 'name': shareddrive['name'], 'createdTime': shareddrive['createdTime']}
66133
66196
  if addCSVData:
66134
66197
  baserow.update(addCSVData)
@@ -66178,11 +66241,7 @@ def printSharedDriveOrganizers(users, useDomainAdminAccess=False):
66178
66241
  showNoOrganizerDrives = SHOW_NO_PERMISSIONS_DRIVES_CHOICE_MAP['false']
66179
66242
  fieldsList = ['role', 'type', 'emailAddress']
66180
66243
  cd = entityList = orgUnitId = query = matchPattern = None
66181
- domainList = set()
66182
- if GC.Values[GC.DOMAIN]:
66183
- domainList.add(GC.Values[GC.DOMAIN])
66184
- else:
66185
- domainList.add(GM.Globals[GM.DECODED_ID_TOKEN].get('hd', 'UNKNOWN').lower())
66244
+ domainList = set([(GC.Values[GC.DOMAIN] if GC.Values[GC.DOMAIN] else _getValueFromOAuth('hd'))])
66186
66245
  oneOrganizer = True
66187
66246
  while Cmd.ArgumentsRemaining():
66188
66247
  myarg = getArgument()
@@ -66333,7 +66392,7 @@ def printSharedDriveOrganizers(users, useDomainAdminAccess=False):
66333
66392
  pass
66334
66393
  if len(matchFeed) == 0:
66335
66394
  setSysExitRC(NO_ENTITIES_FOUND_RC)
66336
- for shareddrive in matchFeed:
66395
+ for shareddrive in sorted(matchFeed, key=lambda k: k['name']):
66337
66396
  row = {'id': shareddrive['id'], 'name': shareddrive['name'],
66338
66397
  'organizers': delimiter.join(shareddrive['organizers']),
66339
66398
  'createdTime': shareddrive['createdTime']}