gam7 7.22.2__tar.gz → 7.22.5__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.22.2 → gam7-7.22.5}/.github/workflows/pushwiki.yml +1 -1
  2. {gam7-7.22.2 → gam7-7.22.5}/PKG-INFO +1 -1
  3. {gam7-7.22.2 → gam7-7.22.5}/src/GamCommands.txt +19 -5
  4. {gam7-7.22.2 → gam7-7.22.5}/src/GamUpdate.txt +30 -1
  5. {gam7-7.22.2 → gam7-7.22.5}/src/gam/__init__.py +156 -92
  6. {gam7-7.22.2 → gam7-7.22.5}/wiki/Basic-Items.md +1 -0
  7. {gam7-7.22.2 → gam7-7.22.5}/wiki/GamUpdates.md +17 -2
  8. {gam7-7.22.2 → gam7-7.22.5}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +1 -1
  9. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Copy-Move.md +2 -7
  10. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Permissions.md +25 -13
  11. {gam7-7.22.2 → gam7-7.22.5}/wiki/Vault-Takeout.md +25 -6
  12. {gam7-7.22.2 → gam7-7.22.5}/wiki/Version-and-Help.md +3 -3
  13. {gam7-7.22.2 → gam7-7.22.5}/wiki/_Sidebar.md +0 -26
  14. {gam7-7.22.2 → gam7-7.22.5}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  15. {gam7-7.22.2 → gam7-7.22.5}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  16. {gam7-7.22.2 → gam7-7.22.5}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  17. {gam7-7.22.2 → gam7-7.22.5}/.github/ISSUE_TEMPLATE.txt +0 -0
  18. {gam7-7.22.2 → gam7-7.22.5}/.github/actions/decrypt.sh +0 -0
  19. {gam7-7.22.2 → gam7-7.22.5}/.github/actions/entitlements.plist +0 -0
  20. {gam7-7.22.2 → gam7-7.22.5}/.github/actions/package_exclusions.txt +0 -0
  21. {gam7-7.22.2 → gam7-7.22.5}/.github/stale.yml +0 -0
  22. {gam7-7.22.2 → gam7-7.22.5}/.github/workflows/build.yml +0 -0
  23. {gam7-7.22.2 → gam7-7.22.5}/.github/workflows/codeql-analysis.yml +0 -0
  24. {gam7-7.22.2 → gam7-7.22.5}/.github/workflows/get-cacerts.yml +0 -0
  25. {gam7-7.22.2 → gam7-7.22.5}/.github/workflows/pypi.yml +0 -0
  26. {gam7-7.22.2 → gam7-7.22.5}/LICENSE +0 -0
  27. {gam7-7.22.2 → gam7-7.22.5}/README.md +0 -0
  28. {gam7-7.22.2 → gam7-7.22.5}/pyproject.toml +0 -0
  29. {gam7-7.22.2 → gam7-7.22.5}/src/.gitignore +0 -0
  30. {gam7-7.22.2 → gam7-7.22.5}/src/LICENSE +0 -0
  31. {gam7-7.22.2 → gam7-7.22.5}/src/README.md +0 -0
  32. {gam7-7.22.2 → gam7-7.22.5}/src/callgam.py +0 -0
  33. {gam7-7.22.2 → gam7-7.22.5}/src/gam/__main__.py +0 -0
  34. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/client.py +0 -0
  37. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/core.py +0 -0
  38. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/data.py +0 -0
  39. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/http.py +0 -0
  40. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/service.py +0 -0
  46. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.22.2 → gam7-7.22.5}/src/gam/atom/url.py +0 -0
  48. {gam7-7.22.2 → gam7-7.22.5}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.22.2 → gam7-7.22.5}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.22.2 → gam7-7.22.5}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.22.2 → gam7-7.22.5}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glapi.py +0 -0
  55. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glcfg.py +0 -0
  56. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glclargs.py +0 -0
  57. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glentity.py +0 -0
  58. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glgapi.py +0 -0
  59. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glgdata.py +0 -0
  60. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glglobals.py +0 -0
  61. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glindent.py +0 -0
  62. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glmsgs.py +0 -0
  63. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glskus.py +0 -0
  64. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.22.2 → gam7-7.22.5}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.22.2 → gam7-7.22.5}/src/gam/meet-v2beta.json +0 -0
  80. {gam7-7.22.2 → gam7-7.22.5}/src/gam/serviceaccountlookup-v1.json +0 -0
  81. {gam7-7.22.2 → gam7-7.22.5}/src/gam-install.sh +0 -0
  82. {gam7-7.22.2 → gam7-7.22.5}/src/gam-setup.bat +0 -0
  83. {gam7-7.22.2 → gam7-7.22.5}/src/gam.exe.manifest +0 -0
  84. {gam7-7.22.2 → gam7-7.22.5}/src/gam.py +0 -0
  85. {gam7-7.22.2 → gam7-7.22.5}/src/gam.spec +0 -0
  86. {gam7-7.22.2 → gam7-7.22.5}/src/gam.wxs +0 -0
  87. {gam7-7.22.2 → gam7-7.22.5}/src/license.rtf +0 -0
  88. {gam7-7.22.2 → gam7-7.22.5}/src/tools/a_atleast_b.py +0 -0
  89. {gam7-7.22.2 → gam7-7.22.5}/src/tools/gen-wix-xml-filelist.py +0 -0
  90. {gam7-7.22.2 → gam7-7.22.5}/src/tools/hooks/hook-googleapiclient.model.py +0 -0
  91. {gam7-7.22.2 → gam7-7.22.5}/src/tools/hooks/hook-httplib2.py +0 -0
  92. {gam7-7.22.2 → gam7-7.22.5}/src/tools/mkGamRef.py +0 -0
  93. {gam7-7.22.2 → gam7-7.22.5}/src/tools/openssl.props +0 -0
  94. {gam7-7.22.2 → gam7-7.22.5}/src/tools/ssd.mjs +0 -0
  95. {gam7-7.22.2 → gam7-7.22.5}/src/version_info.txt.in +0 -0
  96. {gam7-7.22.2 → gam7-7.22.5}/wiki/00scratch.md +0 -0
  97. {gam7-7.22.2 → gam7-7.22.5}/wiki/Addresses.md +0 -0
  98. {gam7-7.22.2 → gam7-7.22.5}/wiki/Administrators.md +0 -0
  99. {gam7-7.22.2 → gam7-7.22.5}/wiki/Alert-Center.md +0 -0
  100. {gam7-7.22.2 → gam7-7.22.5}/wiki/Aliases.md +0 -0
  101. {gam7-7.22.2 → gam7-7.22.5}/wiki/Authorization.md +0 -0
  102. {gam7-7.22.2 → gam7-7.22.5}/wiki/BNF-Syntax.md +0 -0
  103. {gam7-7.22.2 → gam7-7.22.5}/wiki/Bulk-Processing.md +0 -0
  104. {gam7-7.22.2 → gam7-7.22.5}/wiki/Business-Account-Management.md +0 -0
  105. {gam7-7.22.2 → gam7-7.22.5}/wiki/CSV-Input-Filtering.md +0 -0
  106. {gam7-7.22.2 → gam7-7.22.5}/wiki/CSV-Output-Filtering.md +0 -0
  107. {gam7-7.22.2 → gam7-7.22.5}/wiki/CSV-Special-Characters.md +0 -0
  108. {gam7-7.22.2 → gam7-7.22.5}/wiki/Calendars-Access.md +0 -0
  109. {gam7-7.22.2 → gam7-7.22.5}/wiki/Calendars-Events.md +0 -0
  110. {gam7-7.22.2 → gam7-7.22.5}/wiki/Calendars.md +0 -0
  111. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chat-Bot-Setup-Use.md +0 -0
  112. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-AUE-Counts.md +0 -0
  113. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  114. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Installed-Apps.md +0 -0
  115. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  116. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Policies.md +0 -0
  117. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Printers.md +0 -0
  118. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Profile-Management.md +0 -0
  119. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Version-Counts.md +0 -0
  120. {gam7-7.22.2 → gam7-7.22.5}/wiki/Chrome-Version-History.md +0 -0
  121. {gam7-7.22.2 → gam7-7.22.5}/wiki/ChromeOS-Devices.md +0 -0
  122. {gam7-7.22.2 → gam7-7.22.5}/wiki/Classroom-Courses.md +0 -0
  123. {gam7-7.22.2 → gam7-7.22.5}/wiki/Classroom-Guardians.md +0 -0
  124. {gam7-7.22.2 → gam7-7.22.5}/wiki/Classroom-Invitations.md +0 -0
  125. {gam7-7.22.2 → gam7-7.22.5}/wiki/Classroom-Membership.md +0 -0
  126. {gam7-7.22.2 → gam7-7.22.5}/wiki/Classroom-StudentGroups.md +0 -0
  127. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Channel.md +0 -0
  128. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Identity-Devices.md +0 -0
  129. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  130. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Identity-Groups.md +0 -0
  131. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Identity-Policies.md +0 -0
  132. {gam7-7.22.2 → gam7-7.22.5}/wiki/Cloud-Storage.md +0 -0
  133. {gam7-7.22.2 → gam7-7.22.5}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  134. {gam7-7.22.2 → gam7-7.22.5}/wiki/Collections-of-Items.md +0 -0
  135. {gam7-7.22.2 → gam7-7.22.5}/wiki/Collections-of-Users.md +0 -0
  136. {gam7-7.22.2 → gam7-7.22.5}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  137. {gam7-7.22.2 → gam7-7.22.5}/wiki/Command-Line-Parsing.md +0 -0
  138. {gam7-7.22.2 → gam7-7.22.5}/wiki/Command-Logging-Progress.md +0 -0
  139. {gam7-7.22.2 → gam7-7.22.5}/wiki/Context-Aware-Access-Levels.md +0 -0
  140. {gam7-7.22.2 → gam7-7.22.5}/wiki/Customer.md +0 -0
  141. {gam7-7.22.2 → gam7-7.22.5}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  142. {gam7-7.22.2 → gam7-7.22.5}/wiki/Domain-SharedContacts.md +0 -0
  143. {gam7-7.22.2 → gam7-7.22.5}/wiki/Domains-Verification.md +0 -0
  144. {gam7-7.22.2 → gam7-7.22.5}/wiki/Domains.md +0 -0
  145. {gam7-7.22.2 → gam7-7.22.5}/wiki/Downloads-Installs.md +0 -0
  146. {gam7-7.22.2 → gam7-7.22.5}/wiki/Drive-File-Selection.md +0 -0
  147. {gam7-7.22.2 → gam7-7.22.5}/wiki/Drive-Items.md +0 -0
  148. {gam7-7.22.2 → gam7-7.22.5}/wiki/Drive-REST-API-v3.md +0 -0
  149. {gam7-7.22.2 → gam7-7.22.5}/wiki/Email-Audit-Monitor.md +0 -0
  150. {gam7-7.22.2 → gam7-7.22.5}/wiki/Find-File-Owner.md +0 -0
  151. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM-Public-Chat-Room.md +0 -0
  152. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM-Release-Process.md +0 -0
  153. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM-Return-Codes.md +0 -0
  154. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  155. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM7-FAQ.md +0 -0
  156. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM7-on-Android-Devices.md +0 -0
  157. {gam7-7.22.2 → gam7-7.22.5}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  158. {gam7-7.22.2 → gam7-7.22.5}/wiki/Global-Address-List.md +0 -0
  159. {gam7-7.22.2 → gam7-7.22.5}/wiki/Google-Data-Transfers.md +0 -0
  160. {gam7-7.22.2 → gam7-7.22.5}/wiki/Google-Network-Addresses.md +0 -0
  161. {gam7-7.22.2 → gam7-7.22.5}/wiki/Groups-Membership.md +0 -0
  162. {gam7-7.22.2 → gam7-7.22.5}/wiki/Groups.md +0 -0
  163. {gam7-7.22.2 → gam7-7.22.5}/wiki/HTTPS-Proxy.md +0 -0
  164. {gam7-7.22.2 → gam7-7.22.5}/wiki/Home.md +0 -0
  165. {gam7-7.22.2 → gam7-7.22.5}/wiki/How-to-Install-GAM7.md +0 -0
  166. {gam7-7.22.2 → gam7-7.22.5}/wiki/How-to-Uninstall-GAM7.md +0 -0
  167. {gam7-7.22.2 → gam7-7.22.5}/wiki/How-to-Update-GAM7.md +0 -0
  168. {gam7-7.22.2 → gam7-7.22.5}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  169. {gam7-7.22.2 → gam7-7.22.5}/wiki/Inbound-SSO.md +0 -0
  170. {gam7-7.22.2 → gam7-7.22.5}/wiki/Install-GAM-as-Python-Library.md +0 -0
  171. {gam7-7.22.2 → gam7-7.22.5}/wiki/Licenses.md +0 -0
  172. {gam7-7.22.2 → gam7-7.22.5}/wiki/List-Items.md +0 -0
  173. {gam7-7.22.2 → gam7-7.22.5}/wiki/List.md +0 -0
  174. {gam7-7.22.2 → gam7-7.22.5}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  175. {gam7-7.22.2 → gam7-7.22.5}/wiki/Mobile-Devices.md +0 -0
  176. {gam7-7.22.2 → gam7-7.22.5}/wiki/Organizational-Units.md +0 -0
  177. {gam7-7.22.2 → gam7-7.22.5}/wiki/Other-Resources.md +0 -0
  178. {gam7-7.22.2 → gam7-7.22.5}/wiki/Permission-Matches.md +0 -0
  179. {gam7-7.22.2 → gam7-7.22.5}/wiki/Python-Regular-Expressions.md +0 -0
  180. {gam7-7.22.2 → gam7-7.22.5}/wiki/README.md +0 -0
  181. {gam7-7.22.2 → gam7-7.22.5}/wiki/Rclone.md +0 -0
  182. {gam7-7.22.2 → gam7-7.22.5}/wiki/Reports.md +0 -0
  183. {gam7-7.22.2 → gam7-7.22.5}/wiki/Reseller.md +0 -0
  184. {gam7-7.22.2 → gam7-7.22.5}/wiki/Resources.md +0 -0
  185. {gam7-7.22.2 → gam7-7.22.5}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  186. {gam7-7.22.2 → gam7-7.22.5}/wiki/SSL-Root-CA-Certificates.md +0 -0
  187. {gam7-7.22.2 → gam7-7.22.5}/wiki/Schemas.md +0 -0
  188. {gam7-7.22.2 → gam7-7.22.5}/wiki/Scripts.md +0 -0
  189. {gam7-7.22.2 → gam7-7.22.5}/wiki/Send-Email.md +0 -0
  190. {gam7-7.22.2 → gam7-7.22.5}/wiki/Shared-Drives.md +0 -0
  191. {gam7-7.22.2 → gam7-7.22.5}/wiki/Sites.md +0 -0
  192. {gam7-7.22.2 → gam7-7.22.5}/wiki/Tag-Replace.md +0 -0
  193. {gam7-7.22.2 → gam7-7.22.5}/wiki/Todrive.md +0 -0
  194. {gam7-7.22.2 → gam7-7.22.5}/wiki/Unmanaged-Accounts.md +0 -0
  195. {gam7-7.22.2 → gam7-7.22.5}/wiki/Upgrade-Benefits.md +0 -0
  196. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Analytics-Admin.md +0 -0
  197. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Application-Specific-Passwords.md +0 -0
  198. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Backup-Verification-Codes.md +0 -0
  199. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Calendars-Access.md +0 -0
  200. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Calendars-Events.md +0 -0
  201. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Calendars.md +0 -0
  202. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Chat.md +0 -0
  203. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Classification-Labels.md +0 -0
  204. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Classroom-Profile.md +0 -0
  205. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Contacts-Delegates.md +0 -0
  206. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Contacts.md +0 -0
  207. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Deprovision.md +0 -0
  208. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Activity-Settings.md +0 -0
  209. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Cleanup.md +0 -0
  210. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Comments.md +0 -0
  211. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Files-Display.md +0 -0
  212. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Files-Manage.md +0 -0
  213. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Orphans.md +0 -0
  214. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Ownership.md +0 -0
  215. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Query.md +0 -0
  216. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Revisions.md +0 -0
  217. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Shortcuts.md +0 -0
  218. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Drive-Transfer.md +0 -0
  219. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Forms.md +0 -0
  220. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-CSE.md +0 -0
  221. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Delegates.md +0 -0
  222. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Filters.md +0 -0
  223. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Forwarding.md +0 -0
  224. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Labels.md +0 -0
  225. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  226. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Profile.md +0 -0
  227. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-S-MIME.md +0 -0
  228. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  229. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Gmail-Settings.md +0 -0
  230. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Group-Membership.md +0 -0
  231. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Keep-Notes.md +0 -0
  232. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Looker-Studio.md +0 -0
  233. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Meet.md +0 -0
  234. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-People-Contacts-Profiles.md +0 -0
  235. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Photo.md +0 -0
  236. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Profile-Photo.md +0 -0
  237. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Profile-Sharing.md +0 -0
  238. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Shared-Drives.md +0 -0
  239. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  240. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Spreadsheets.md +0 -0
  241. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Tag-Manager.md +0 -0
  242. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Tasks.md +0 -0
  243. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Tokens.md +0 -0
  244. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  245. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users-YouTube.md +0 -0
  246. {gam7-7.22.2 → gam7-7.22.5}/wiki/Users.md +0 -0
  247. {gam7-7.22.2 → gam7-7.22.5}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  248. {gam7-7.22.2 → gam7-7.22.5}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  249. {gam7-7.22.2 → gam7-7.22.5}/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation.md +0 -0
  250. {gam7-7.22.2 → gam7-7.22.5}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  251. {gam7-7.22.2 → gam7-7.22.5}/wiki/gam.cfg.md +0 -0
  252. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-AdminSettingsExamples.md +0 -0
  253. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Android-Installation.md +0 -0
  254. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-BulkOperations.md +0 -0
  255. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-CalendarExamples.md +0 -0
  256. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Chat-Bot.md +0 -0
  257. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Chrome-Browser-Management.md +0 -0
  258. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Chrome-OS-Installation.md +0 -0
  259. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Chrome-Policy-Settings.md +0 -0
  260. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Cloud-Identity-Groups.md +0 -0
  261. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Calendar-Resources.md +0 -0
  262. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Calendars.md +0 -0
  263. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Definitions.md +0 -0
  264. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Drive.md +0 -0
  265. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Email.md +0 -0
  266. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Group-Attributes.md +0 -0
  267. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Groups.md +0 -0
  268. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Command-Reference-Users.md +0 -0
  269. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Context-Aware-Access-Levels.md +0 -0
  270. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  271. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-CreatingClientSecretsFile.md +0 -0
  272. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Custom-Schemas.md +0 -0
  273. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Data-Transfers.md +0 -0
  274. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-DomainVerification.md +0 -0
  275. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-ExamplesAccountAuditing.md +0 -0
  276. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-ExamplesCSV.md +0 -0
  277. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-ExamplesEmailSettings.md +0 -0
  278. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-ExamplesOrganizations.md +0 -0
  279. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM-Discussion-Group.md +0 -0
  280. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  281. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM-options-files.md +0 -0
  282. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM-with--minimal-GCP-rights.md +0 -0
  283. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM3CSVListings.md +0 -0
  284. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM3DirectoryCommands.md +0 -0
  285. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GAM3GroupSettings.md +0 -0
  286. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Google-Vault---Takeout-Commands.md +0 -0
  287. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-GoogleDriveManagement.md +0 -0
  288. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Grouping-18-or-Older-Users.md +0 -0
  289. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Home.md +0 -0
  290. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  291. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Inbound-SSO-Settings.md +0 -0
  292. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-LicenseExamples.md +0 -0
  293. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Managing-Admins.md +0 -0
  294. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Managing-CloudPrint-Printers.md +0 -0
  295. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Managing-Devices.md +0 -0
  296. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Managing-Google-Classroom.md +0 -0
  297. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-OAuthKeyManagement.md +0 -0
  298. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Printers.md +0 -0
  299. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-ResellerCommands.md +0 -0
  300. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-SecurityExamples.md +0 -0
  301. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-UnmanagedUsersExamples.md +0 -0
  302. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  303. {gam7-7.22.2/wiki → gam7-7.22.5/wiki/legacy}/l-_Footer.md +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
  cd GAM.wiki
38
38
  git config --local user.email "action@github.com"
39
39
  git config --local user.name "GitHub Action"
40
- git add *.md
40
+ git add -A
41
41
  git commit -m "[no ci] Push Wiki changes"
42
42
  git status
43
43
  git push
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.22.2
3
+ Version: 7.22.5
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
@@ -565,6 +565,7 @@ If an item contains spaces, it should be surrounded by ".
565
565
  See: https://support.google.com/mail/answer/7190
566
566
  <QueryGroup> ::= <String>
567
567
  See: https://developers.google.com/admin-sdk/directory/v1/guides/search-groups
568
+ <QueryItem> ::= <UniqueID>|<String>
568
569
  <QueryMemberRestrictions> ::= <String>
569
570
  See: https://cloud.google.com/identity/docs/reference/rest/v1beta1/SecuritySettings#MemberRestriction
570
571
  <QueryMobile> ::= <String>
@@ -5422,6 +5423,15 @@ gam print vaultcounts [todrive <ToDriveAttributes>*]
5422
5423
  gam print vaultcounts [todrive <ToDriveAttributes>*]
5423
5424
  matter <MatterItem> operation <String> [wait <Integer>]
5424
5425
 
5426
+ gam create vaultexport|export matter <MatterItem> [name <String>]
5427
+ vaultquery <QueryItem>
5428
+ [driveclientsideencryption any|encrypted|unencrypted]
5429
+ [includeaccessinfo <Boolean>]
5430
+ [excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
5431
+ [showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
5432
+ [format ics|mbox|pst|xml]
5433
+ [region any|europe|us] [showdetails|returnidonly]
5434
+
5425
5435
  gam create vaultexport|export matter <MatterItem> [name <String>] corpus calendar|drive|gemini|groups|hangouts_chat|mail|voice
5426
5436
  (accounts <EmailAddressEntity>) | (orgunit|org|ou <OrgUnitPath>) | everyone
5427
5437
  (shareddrives|teamdrives (<SharedDriveIDList>|(select <FileSelector>|<CSVFileSelector>))) |
@@ -5432,12 +5442,13 @@ gam create vaultexport|export matter <MatterItem> [name <String>] corpus calenda
5432
5442
  [locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
5433
5443
  [responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
5434
5444
  [(includeshareddrives <Boolean>)|(shareddrivesoption included|included_if_account_is_not_a_member|not_included)]
5435
- [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
5436
- [driveclientsideencryption any|encrypted|unencrypted]
5445
+ [driveversiondate <Date>|<Time>]
5437
5446
  [includerooms <Boolean>]
5447
+ (covereddata calllogs|textmessages|voicemails)*
5448
+ [driveclientsideencryption any|encrypted|unencrypted]
5449
+ [includeaccessinfo <Boolean>]
5438
5450
  [excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
5439
5451
  [showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
5440
- [covereddata calllogs|textmessages|voicemails]
5441
5452
  [format ics|mbox|pst|xml]
5442
5453
  [region any|europe|us] [showdetails|returnidonly]
5443
5454
  gam delete vaultexport|export <ExportItem> matter <MatterItem>
@@ -5493,18 +5504,21 @@ gam show vaultexports|exports
5493
5504
  [fields <VaultExportFieldNameList>] [shownames]
5494
5505
  [formatjson]
5495
5506
 
5507
+ gam create vaulthold|hold matter <MatterItem> [name <String>]
5508
+ vaultquery <QueryItem>
5509
+ [showdetails|returnidonly]
5496
5510
  gam create vaulthold|hold matter <MatterItem> [name <String>] corpus calendar|drive|mail|groups|hangouts_chat|voice
5497
5511
  [(accounts|groups|users <EmailItemList>) | (orgunit|org|ou <OrgUnit>)]
5498
5512
  [query <QueryVaultCorpus>]
5499
5513
  [terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
5500
- [includerooms <Boolean>] [covereddata calllogs|textmessages|voicemails]
5514
+ [includerooms <Boolean>] (covereddata calllogs|textmessages|voicemails)*
5501
5515
  [includeshareddrives <Boolean>]
5502
5516
  [showdetails|returnidonly]
5503
5517
  gam update vaulthold|hold <HoldItem> matter <MatterItem>
5504
5518
  [([addaccounts|addgroups|addusers <EmailItemList>] [removeaccounts|removegroups|removeusers <EmailItemList>]) | (orgunit|org|ou <OrgUnit>)]
5505
5519
  [query <QueryVaultCorpus>]
5506
5520
  [terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
5507
- [includerooms <Boolean>] [covereddata calllogs|textmessages|voicemails]
5521
+ [includerooms <Boolean>] (covereddata calllogs|textmessages|voicemails)*
5508
5522
  [includeshareddrives <Boolean>]
5509
5523
  [showdetails]
5510
5524
  gam delete vaulthold|hold <HoldItem> matter <MatterItem>
@@ -1,7 +1,36 @@
1
+ 7.22.05
2
+
3
+ Added a variant of `gam create vaultexport` that gets its query parameters from a saved Vault query.
4
+
5
+ ```
6
+ gam create vaultexport|export matter <MatterItem> [name <String>]
7
+ vaultquery <QueryItem>
8
+ [driveclientsideencryption any|encrypted|unencrypted]
9
+ [includeaccessinfo <Boolean>]
10
+ [excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
11
+ [showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
12
+ [format ics|mbox|pst|xml]
13
+ [region any|europe|us] [showdetails|returnidonly]
14
+ ```
15
+
16
+ 7.22.04
17
+
18
+ Added a variant of `gam create vaulthold` that gets its parameters from a saved Vault query.
19
+ ```
20
+ gam create vaulthold matter <MatterItem> [name <String>]
21
+ vaultquery <QueryItem>
22
+ [showdetails|returnidonly]
23
+ ```
24
+
25
+ 7.22.03
26
+
27
+ Fix backwards compatability bug introduced in 7.22.00 for `gam print users` that changed `suspended`
28
+ from a field name to a query option; it is now correctly interpreted as a field name.
29
+
1
30
  7.22.02
2
31
 
3
32
  An update to the httplib2 library caused GAM proxy connections to fail; this has been fixed
4
- by includinbg the pysocks library needed by the latest httplib2 library.
33
+ by including the pysocks library needed by the latest httplib2 library.
5
34
 
6
35
  7.22.00
7
36
 
@@ -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.22.02'
28
+ __version__ = '7.22.05'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -18989,10 +18989,10 @@ def doPrintAliases():
18989
18989
  pass
18990
18990
  elif myarg == 'select':
18991
18991
  _, users = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
18992
- elif myarg in SUSPENDED_ARGUMENTS:
18993
- isSuspended = _getIsSuspended(myarg)
18994
- elif myarg in ARCHIVED_ARGUMENTS:
18995
- isArchived = _getIsArchived(myarg)
18992
+ elif myarg == 'issuspended':
18993
+ isSuspended = getBoolean()
18994
+ elif myarg == 'isarchived':
18995
+ isArchived = getBoolean()
18996
18996
  elif myarg in {'user','users'}:
18997
18997
  users.extend(convertEntityToList(getString(Cmd.OB_EMAIL_ADDRESS_LIST, minLen=0)))
18998
18998
  elif myarg in {'group', 'groups'}:
@@ -41654,7 +41654,7 @@ def convertQueryNameToID(v, nameOrId, matterId, matterNameId):
41654
41654
  query = callGAPI(v.matters().savedQueries(), 'get',
41655
41655
  throwReasons=[GAPI.NOT_FOUND, GAPI.BAD_REQUEST, GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41656
41656
  matterId=matterId, savedQueryId=cg.group(1))
41657
- return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']))
41657
+ return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']), query['query'])
41658
41658
  except (GAPI.notFound, GAPI.badRequest):
41659
41659
  entityDoesNotHaveItemExit([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, nameOrId])
41660
41660
  except (GAPI.forbidden, GAPI.invalidArgument) as e:
@@ -41663,12 +41663,12 @@ def convertQueryNameToID(v, nameOrId, matterId, matterNameId):
41663
41663
  try:
41664
41664
  queries = callGAPIpages(v.matters().savedQueries(), 'list', 'savedQueries',
41665
41665
  throwReasons=[GAPI.FORBIDDEN, GAPI.INVALID_ARGUMENT],
41666
- matterId=matterId, fields='savedQueries(savedQueryId,displayName),nextPageToken')
41666
+ matterId=matterId, fields='savedQueries(savedQueryId,displayName,query),nextPageToken')
41667
41667
  except (GAPI.forbidden, GAPI.invalidArgument) as e:
41668
41668
  ClientAPIAccessDeniedExit(str(e))
41669
41669
  for query in queries:
41670
41670
  if query['displayName'].lower() == nameOrIdlower:
41671
- return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']))
41671
+ return (query['savedQueryId'], query['displayName'], formatVaultNameId(query['savedQueryId'], query['displayName']), query['query'])
41672
41672
  entityDoesNotHaveItemExit([Ent.VAULT_MATTER, matterNameId, Ent.VAULT_QUERY, nameOrId])
41673
41673
 
41674
41674
  def getMatterItem(v, state=None):
@@ -41891,12 +41891,13 @@ def _buildVaultQuery(myarg, query, corpusArgumentMap):
41891
41891
  query['hangoutsChatOptions'] = {'includeRooms': getBoolean()}
41892
41892
  # mail
41893
41893
  elif myarg == 'excludedrafts':
41894
- query['mailOptions'] = {'excludeDrafts': getBoolean()}
41894
+ query.setdefault('mailOptions', {})['excludeDrafts'] = getBoolean()
41895
41895
  elif myarg == 'mailclientsideencryption':
41896
41896
  query.setdefault('mailOptions', {})['clientSideEncryptedOption'] = getChoice(VAULT_CSE_OPTION_MAP, mapChoice=True)
41897
41897
  # voice
41898
41898
  elif myarg == 'covereddata':
41899
- query['voiceOptions'] = {'coveredData': getChoice(VAULT_VOICE_COVERED_DATA_MAP, mapChoice=True)}
41899
+ query.setdefault('voiceOptions', {'coveredData': []})
41900
+ query['voiceOptions']['coveredData'].append(getChoice(VAULT_VOICE_COVERED_DATA_MAP, mapChoice=True))
41900
41901
 
41901
41902
  def _validateVaultQuery(body, corpusArgumentMap):
41902
41903
  if 'corpus' not in body['query']:
@@ -41908,7 +41909,16 @@ def _validateVaultQuery(body, corpusArgumentMap):
41908
41909
  if body['query']['corpus'] != corpus:
41909
41910
  body['exportOptions'].pop(options, None)
41910
41911
 
41911
- # gam create vaultexport|export matter <MatterItem> [name <String>] corpus calendar|drive|gemini|groups|hangouts_chat|mail|voice
41912
+ # gam create vaultexport|export matter <MatterItem> [name <String>]
41913
+ # vaultquery <QueryItem>
41914
+ # [driveclientsideencryption any|encrypted|unencrypted]
41915
+ # [includeaccessinfo <Boolean>]
41916
+ # [excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
41917
+ # [showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
41918
+ # [format ics|mbox|pst|xml]
41919
+ # [region any|europe|us] [showdetails|returnidonly]
41920
+ # gam create vaultexport|export matter <MatterItem> [name <String>]
41921
+ # corpus calendar|drive|gemini|groups|hangouts_chat|mail|voice
41912
41922
  # (accounts <EmailAddressEntity>) | (orgunit|org|ou <OrgUnitPath>) | everyone
41913
41923
  # (shareddrives|teamdrives (<SharedDriveIDList>|(select <FileSelector>|<CSVFileSelector>))) |
41914
41924
  # (rooms (<ChatSpaceList>|(select <FileSelector>|<CSVFileSelector>))) |
@@ -41918,23 +41928,25 @@ def _validateVaultQuery(body, corpusArgumentMap):
41918
41928
  # [locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
41919
41929
  # [responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
41920
41930
  # [(includeshareddrives <Boolean>)|(shareddrivesoption included|included_if_account_is_not_a_member|not_included)]
41921
- # [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
41922
- # [driveclientsideencryption any|encrypted|unencrypted]
41931
+ # [driveversiondate <Date>|<Time>]
41923
41932
  # [includerooms <Boolean>]
41933
+ # (covereddata calllogs|textmessages|voicemails)*
41934
+ # [driveclientsideencryption any|encrypted|unencrypted]
41935
+ # [includeaccessinfo <Boolean>]
41924
41936
  # [excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
41925
41937
  # [showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
41926
- # [covereddata calllogs|textmessages|voicemails]
41927
41938
  # [format ics|mbox|pst|xml]
41928
41939
  # [region any|europe|us] [showdetails|returnidonly]
41929
41940
  def doCreateVaultExport():
41930
41941
  v = buildGAPIObject(API.VAULT)
41931
41942
  matterId = None
41932
41943
  body = {'query': {'dataScope': 'ALL_DATA'}, 'exportOptions': {}}
41944
+ includeAccessInfo = None
41933
41945
  exportFormat = None
41946
+ useNewExport = None
41934
41947
  showConfidentialModeContent = None
41935
41948
  exportLinkedDriveFiles = None
41936
41949
  returnIdOnly = showDetails = False
41937
- useNewExport = None
41938
41950
  while Cmd.ArgumentsRemaining():
41939
41951
  myarg = getArgument()
41940
41952
  if myarg == 'matter':
@@ -41942,22 +41954,22 @@ def doCreateVaultExport():
41942
41954
  body['matterId'] = matterId
41943
41955
  elif myarg == 'name':
41944
41956
  body['name'] = getString(Cmd.OB_STRING)
41957
+ elif matterId is not None and myarg == 'vaultquery':
41958
+ _, _, _, body['query'] = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
41945
41959
  elif myarg in VAULT_QUERY_ARGS:
41946
41960
  _buildVaultQuery(myarg, body['query'], VAULT_CORPUS_ARGUMENT_MAP)
41947
- elif myarg == 'usenewexport':
41948
- useNewExport = getBoolean()
41961
+ elif myarg == 'includeaccessinfo':
41962
+ includeAccessInfo = getBoolean()
41949
41963
  elif myarg == 'format':
41950
41964
  exportFormat = getChoice(VAULT_EXPORT_FORMAT_MAP, mapChoice=True)
41965
+ elif myarg == 'usenewexport':
41966
+ useNewExport = getBoolean()
41951
41967
  elif myarg == 'showconfidentialmodecontent':
41952
41968
  showConfidentialModeContent = getBoolean()
41953
41969
  elif myarg == 'exportlinkeddrivefiles':
41954
41970
  exportLinkedDriveFiles = getBoolean()
41955
41971
  elif myarg == 'region':
41956
41972
  body['exportOptions']['region'] = getChoice(VAULT_EXPORT_REGION_MAP, mapChoice=True)
41957
- elif myarg == 'includeaccessinfo':
41958
- body['exportOptions'].setdefault('driveOptions', {})['includeAccessInfo'] = getBoolean()
41959
- elif myarg == 'covereddata':
41960
- body['exportOptions'].setdefault('voiceOptions', {})['coveredData'] = getChoice(VAULT_VOICE_COVERED_DATA_MAP, mapChoice=True)
41961
41973
  elif myarg == 'showdetails':
41962
41974
  showDetails = True
41963
41975
  returnIdOnly = False
@@ -41977,7 +41989,10 @@ def doCreateVaultExport():
41977
41989
  if 'name' not in body:
41978
41990
  body['name'] = f'GAM {body["query"]["corpus"]} Export - {ISOformatTimeStamp(todaysTime())}'
41979
41991
  optionsField = VAULT_CORPUS_OPTIONS_MAP[body['query']['corpus']]
41980
- if body['query']['corpus'] != 'DRIVE':
41992
+ if body['query']['corpus'] == 'DRIVE':
41993
+ if includeAccessInfo is not None:
41994
+ body['exportOptions'][optionsField]['includeAccessInfo'] = includeAccessInfo
41995
+ else:
41981
41996
  body['exportOptions'][optionsField] = {'exportFormat': exportFormat}
41982
41997
  if body['query']['corpus'] == 'MAIL':
41983
41998
  if showConfidentialModeContent is not None:
@@ -42459,6 +42474,34 @@ def _showVaultHold(matterNameId, hold, cd, FJQC, k=0, kcount=0):
42459
42474
  showJSON(None, hold, timeObjects=VAULT_HOLD_TIME_OBJECTS)
42460
42475
  Ind.Decrement()
42461
42476
 
42477
+ def _useVaultQuery(v, matterId, matterNameId, body):
42478
+ _, _, _, query = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
42479
+ body['corpus'] = query['corpus']
42480
+ method = query.get('method')
42481
+ if method == 'ACCOUNT':
42482
+ body['accounts'] = []
42483
+ for email in query['accountInfo']['emails']:
42484
+ body['accounts'].append({'email': email})
42485
+ elif method == 'ORG_UNIT':
42486
+ body['orgUnit'] = {'orgUnitId': query['orgUnitInfo']['orgUnitId']}
42487
+ queryType = VAULT_CORPUS_QUERY_MAP[query['corpus']]
42488
+ if queryType is None:
42489
+ return
42490
+ body['query'] = {queryType: {}}
42491
+ if query['corpus'] == 'DRIVE':
42492
+ body['query'][queryType]['includeSharedDriveFiles'] = query['driveOptions'].get('includeSharedDrives', False)
42493
+ elif query['corpus'] in {'GROUPS', 'MAIL'}:
42494
+ if query.get('terms'):
42495
+ body['query'][queryType]['terms'] = query['terms']
42496
+ if query.get('startTime'):
42497
+ body['query'][queryType]['startTime'] = query['startTime']
42498
+ if query.get('endTime'):
42499
+ body['query'][queryType]['endTime'] = query['endTime']
42500
+ elif query['corpus'] == 'HANGOUTS_CHAT':
42501
+ body['query'][queryType]['includeRooms'] = query['hangoutsChatOptions'].get('includeRooms', False)
42502
+ elif query['corpus'] == 'VOICE':
42503
+ body['query'][queryType]['coveredData'] = query['voiceOptions']['coveredData']
42504
+
42462
42505
  def _getHoldQueryParameters(myarg, queryParameters):
42463
42506
  if myarg == 'query':
42464
42507
  queryParameters['queryLocation'] = Cmd.Location()
@@ -42474,7 +42517,8 @@ def _getHoldQueryParameters(myarg, queryParameters):
42474
42517
  elif myarg in {'includeshareddrives', 'includeteamdrives'}:
42475
42518
  queryParameters['includeSharedDriveFiles'] = getBoolean()
42476
42519
  elif myarg == 'covereddata':
42477
- queryParameters['coveredData'] = getChoice(VAULT_VOICE_COVERED_DATA_MAP, mapChoice=True)
42520
+ queryParameters.setdefault('coveredData', [])
42521
+ queryParameters['coveredData'].append(getChoice(VAULT_VOICE_COVERED_DATA_MAP, mapChoice=True))
42478
42522
  else:
42479
42523
  return False
42480
42524
  return True
@@ -42509,7 +42553,11 @@ def _setHoldQuery(body, queryParameters):
42509
42553
  if queryParameters.get('coveredData'):
42510
42554
  body['query'][queryType]['coveredData'] = queryParameters['coveredData']
42511
42555
 
42512
- # gam create vaulthold|hold matter <MatterItem> [name <String>] corpus calendar|drive|mail|groups|hangouts_chat|voice
42556
+ # gam create vaulthold|hold matter <MatterItem> [name <String>]
42557
+ # vaultquery <QueryItem>
42558
+ # [showdetails|returnidonly]
42559
+ # gam create vaulthold|hold matter <MatterItem> [name <String>]
42560
+ # corpus calendar|drive|mail|groups|hangouts_chat|voice
42513
42561
  # [(accounts|groups|users <EmailItemList>) | (orgunit|org|ou <OrgUnit>)]
42514
42562
  # [query <QueryVaultCorpus>]
42515
42563
  # [terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
@@ -42523,13 +42571,16 @@ def doCreateVaultHold():
42523
42571
  matterId = None
42524
42572
  accounts = []
42525
42573
  queryParameters = {}
42526
- returnIdOnly = showDetails = False
42574
+ returnIdOnly = showDetails = usedVaultQuery = False
42527
42575
  while Cmd.ArgumentsRemaining():
42528
42576
  myarg = getArgument()
42529
42577
  if myarg == 'matter':
42530
42578
  matterId, matterNameId = getMatterItem(v)
42531
42579
  elif myarg == 'name':
42532
42580
  body['name'] = getString(Cmd.OB_STRING)
42581
+ elif matterId is not None and myarg == 'vaultquery':
42582
+ _useVaultQuery(v, matterId, matterNameId, body)
42583
+ usedVaultQuery = True
42533
42584
  elif myarg == 'corpus':
42534
42585
  body['corpus'] = getChoice(VAULT_CORPUS_ARGUMENT_MAP, mapChoice=True)
42535
42586
  elif myarg in {'accounts', 'users', 'groups'}:
@@ -42553,7 +42604,8 @@ def doCreateVaultHold():
42553
42604
  missingArgumentExit(f'corpus {"|".join(VAULT_CORPUS_ARGUMENT_MAP)}')
42554
42605
  if 'name' not in body:
42555
42606
  body['name'] = f'GAM {body["corpus"]} Hold - {ISOformatTimeStamp(todaysTime())}'
42556
- _setHoldQuery(body, queryParameters)
42607
+ if not usedVaultQuery:
42608
+ _setHoldQuery(body, queryParameters)
42557
42609
  if accounts:
42558
42610
  body['accounts'] = []
42559
42611
  cd = buildGAPIObject(API.DIRECTORY)
@@ -43006,7 +43058,7 @@ def doInfoVaultQuery():
43006
43058
  v = buildGAPIObject(API.VAULT)
43007
43059
  if not Cmd.ArgumentIsAhead('matter'):
43008
43060
  matterId, matterNameId = getMatterItem(v)
43009
- queryId, queryName, queryNameId = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
43061
+ queryId, queryName, queryNameId, _ = convertQueryNameToID(v, getString(Cmd.OB_QUERY_ITEM), matterId, matterNameId)
43010
43062
  else:
43011
43063
  queryName = getString(Cmd.OB_QUERY_ITEM)
43012
43064
  cd = drive = None
@@ -43016,7 +43068,7 @@ def doInfoVaultQuery():
43016
43068
  myarg = getArgument()
43017
43069
  if myarg == 'matter':
43018
43070
  matterId, matterNameId = getMatterItem(v)
43019
- queryId, queryName, queryNameId = convertQueryNameToID(v, queryName, matterId, matterNameId)
43071
+ queryId, queryName, queryNameId, _ = convertQueryNameToID(v, queryName, matterId, matterNameId)
43020
43072
  elif myarg == 'shownames':
43021
43073
  cd = buildGAPIObject(API.DIRECTORY)
43022
43074
  _, drive = buildGAPIServiceObject(API.DRIVE3, _getAdminEmail())
@@ -45754,71 +45806,81 @@ def doPrintUsers(entityList=None):
45754
45806
  csvPF.WriteRowNoFilter(row)
45755
45807
 
45756
45808
  def _printUser(userEntity, i, count):
45757
- if isSuspended is None or isSuspended == userEntity.get('suspended', isSuspended):
45758
- if showValidColumn:
45759
- userEntity[showValidColumn] = True
45760
- userEmail = userEntity['primaryEmail']
45761
- if printOptions['emailParts']:
45762
- if userEmail.find('@') != -1:
45763
- userEntity['primaryEmailLocal'], userEntity['primaryEmailDomain'] = splitEmailAddress(userEmail)
45764
- if 'languages' in userEntity and not FJQC.formatJSON:
45765
- userEntity['languages'] = _formatLanguagesList(userEntity.pop('languages'), delimiter)
45766
- for location in userEntity.get('locations', []):
45767
- location['buildingName'] = _getBuildingNameById(cd, location.get('buildingId', ''))
45768
- if quotePlusPhoneNumbers:
45769
- for phone in userEntity.get('phones', []):
45770
- phoneNumber = phone.get('value', '')
45771
- if phoneNumber.startswith('+'):
45772
- phone['value'] = "'"+phoneNumber
45773
- if schemaParms['selectedSchemaFields']:
45774
- _filterSchemaFields(userEntity, schemaParms)
45775
- if printOptions['getGroupFeed']:
45776
- printGettingAllEntityItemsForWhom(Ent.GROUP_MEMBERSHIP, userEmail, i, count)
45777
- try:
45778
- groups = callGAPIpages(cd.groups(), 'list', 'groups',
45779
- pageMessage=getPageMessageForWhom(),
45780
- throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
45781
- retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
45782
- userKey=userEmail, orderBy='email', fields='nextPageToken,groups(email)')
45783
- numGroups = len(groups)
45784
- if not printOptions['groupsInColumns']:
45785
- userEntity['GroupsCount'] = numGroups
45786
- userEntity['Groups'] = delimiter.join([groupname['email'] for groupname in groups])
45787
- else:
45788
- if numGroups > printOptions['maxGroups']:
45789
- printOptions['maxGroups'] = numGroups
45790
- userEntity['Groups'] = numGroups
45791
- for j, group in enumerate(groups):
45792
- userEntity[f'Groups{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{j}'] = group['email']
45793
- except (GAPI.invalidMember, GAPI.invalidInput):
45794
- badRequestWarning(Ent.GROUP, Ent.MEMBER, userEmail)
45795
- except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest):
45796
- accessErrorExit(cd)
45797
- if aliasMatchPattern and 'aliases' in userEntity:
45798
- userEntity['aliases'] = [alias for alias in userEntity['aliases'] if aliasMatchPattern.match(alias)]
45799
- if printOptions['getLicenseFeed'] or printOptions['getLicenseFeedByUser']:
45800
- if printOptions['getLicenseFeed']:
45801
- u_licenses = licenses.get(userEmail.lower(), [])
45809
+ if (isSuspended is None and isArchived is None):
45810
+ showUser = True
45811
+ elif (isSuspended is not None and isArchived is None):
45812
+ showUser = isSuspended == userEntity.get('suspended', isSuspended)
45813
+ elif (isSuspended is None and isArchived is not None):
45814
+ showUser = isArchived == userEntity.get('archived', isArchived)
45815
+ else:
45816
+ showUser = ((isSuspended == userEntity.get('suspended', isSuspended)) or
45817
+ (isArchived == userEntity.get('archived', isArchived)))
45818
+ if not showUser:
45819
+ return
45820
+ if showValidColumn:
45821
+ userEntity[showValidColumn] = True
45822
+ userEmail = userEntity['primaryEmail']
45823
+ if printOptions['emailParts']:
45824
+ if userEmail.find('@') != -1:
45825
+ userEntity['primaryEmailLocal'], userEntity['primaryEmailDomain'] = splitEmailAddress(userEmail)
45826
+ if 'languages' in userEntity and not FJQC.formatJSON:
45827
+ userEntity['languages'] = _formatLanguagesList(userEntity.pop('languages'), delimiter)
45828
+ for location in userEntity.get('locations', []):
45829
+ location['buildingName'] = _getBuildingNameById(cd, location.get('buildingId', ''))
45830
+ if quotePlusPhoneNumbers:
45831
+ for phone in userEntity.get('phones', []):
45832
+ phoneNumber = phone.get('value', '')
45833
+ if phoneNumber.startswith('+'):
45834
+ phone['value'] = "'"+phoneNumber
45835
+ if schemaParms['selectedSchemaFields']:
45836
+ _filterSchemaFields(userEntity, schemaParms)
45837
+ if printOptions['getGroupFeed']:
45838
+ printGettingAllEntityItemsForWhom(Ent.GROUP_MEMBERSHIP, userEmail, i, count)
45839
+ try:
45840
+ groups = callGAPIpages(cd.groups(), 'list', 'groups',
45841
+ pageMessage=getPageMessageForWhom(),
45842
+ throwReasons=GAPI.GROUP_LIST_USERKEY_THROW_REASONS,
45843
+ retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
45844
+ userKey=userEmail, orderBy='email', fields='nextPageToken,groups(email)')
45845
+ numGroups = len(groups)
45846
+ if not printOptions['groupsInColumns']:
45847
+ userEntity['GroupsCount'] = numGroups
45848
+ userEntity['Groups'] = delimiter.join([groupname['email'] for groupname in groups])
45802
45849
  else:
45803
- u_licenses = getUserLicenses(lic, userEntity, skus)
45804
- if not oneLicensePerRow:
45805
- userEntity['LicensesCount'] = len(u_licenses)
45806
- if u_licenses:
45807
- userEntity['Licenses'] = delimiter.join(u_licenses)
45808
- userEntity['LicensesDisplay'] = delimiter.join([SKU.skuIdToDisplayName(skuId) for skuId in u_licenses])
45850
+ if numGroups > printOptions['maxGroups']:
45851
+ printOptions['maxGroups'] = numGroups
45852
+ userEntity['Groups'] = numGroups
45853
+ for j, group in enumerate(groups):
45854
+ userEntity[f'Groups{GC.Values[GC.CSV_OUTPUT_SUBFIELD_DELIMITER]}{j}'] = group['email']
45855
+ except (GAPI.invalidMember, GAPI.invalidInput):
45856
+ badRequestWarning(Ent.GROUP, Ent.MEMBER, userEmail)
45857
+ except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.forbidden, GAPI.badRequest):
45858
+ accessErrorExit(cd)
45859
+ if aliasMatchPattern and 'aliases' in userEntity:
45860
+ userEntity['aliases'] = [alias for alias in userEntity['aliases'] if aliasMatchPattern.match(alias)]
45861
+ if printOptions['getLicenseFeed'] or printOptions['getLicenseFeedByUser']:
45862
+ if printOptions['getLicenseFeed']:
45863
+ u_licenses = licenses.get(userEmail.lower(), [])
45809
45864
  else:
45810
- u_licenses = []
45865
+ u_licenses = getUserLicenses(lic, userEntity, skus)
45811
45866
  if not oneLicensePerRow:
45812
- _writeUserEntity(userEntity)
45813
- else:
45867
+ userEntity['LicensesCount'] = len(u_licenses)
45814
45868
  if u_licenses:
45815
- for skuId in u_licenses:
45816
- userEntity['License'] = skuId
45817
- userEntity['LicenseDisplay'] = SKU.skuIdToDisplayName(skuId)
45818
- _writeUserEntity(userEntity)
45819
- else:
45820
- userEntity['License'] = userEntity['LicenseDisplay'] = ''
45869
+ userEntity['Licenses'] = delimiter.join(u_licenses)
45870
+ userEntity['LicensesDisplay'] = delimiter.join([SKU.skuIdToDisplayName(skuId) for skuId in u_licenses])
45871
+ else:
45872
+ u_licenses = []
45873
+ if not oneLicensePerRow:
45874
+ _writeUserEntity(userEntity)
45875
+ else:
45876
+ if u_licenses:
45877
+ for skuId in u_licenses:
45878
+ userEntity['License'] = skuId
45879
+ userEntity['LicenseDisplay'] = SKU.skuIdToDisplayName(skuId)
45821
45880
  _writeUserEntity(userEntity)
45881
+ else:
45882
+ userEntity['License'] = userEntity['LicenseDisplay'] = ''
45883
+ _writeUserEntity(userEntity)
45822
45884
 
45823
45885
  def _updateDomainCounts(emailAddress):
45824
45886
  nonlocal domainCounts
@@ -45911,10 +45973,10 @@ def doPrintUsers(entityList=None):
45911
45973
  showDeleted = True
45912
45974
  elif entityList is None and myarg == 'select':
45913
45975
  _, entityList = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
45914
- elif myarg in SUSPENDED_ARGUMENTS:
45915
- isSuspended = _getIsSuspended(myarg)
45916
- elif myarg in ARCHIVED_ARGUMENTS:
45917
- isArchived = _getIsArchived(myarg)
45976
+ elif myarg == 'issuspended':
45977
+ isSuspended = getBoolean()
45978
+ elif myarg == 'isarchived':
45979
+ isArchived = getBoolean()
45918
45980
  elif myarg == 'orderby':
45919
45981
  orderBy, sortOrder = getOrderBySortOrder(USERS_ORDERBY_CHOICE_MAP)
45920
45982
  elif myarg == 'userview':
@@ -46092,6 +46154,8 @@ def doPrintUsers(entityList=None):
46092
46154
  # If no individual fields were specified (allfields, basic, full) or individual fields other than primaryEmail were specified, look up each user
46093
46155
  if isSuspended is not None and fieldsList:
46094
46156
  fieldsList.append('suspended')
46157
+ if isArchived is not None and fieldsList:
46158
+ fieldsList.append('archived')
46095
46159
  if projectionSet or len(set(fieldsList)) > 1 or showValidColumn:
46096
46160
  jcount = len(entityList)
46097
46161
  fields = getFieldsFromFieldsList(fieldsList)
@@ -462,6 +462,7 @@
462
462
  See: https://support.google.com/mail/answer/7190
463
463
  <QueryGroup> ::= <String>
464
464
  See: https://developers.google.com/admin-sdk/directory/v1/guides/search-groups
465
+ <QueryItem> ::= <UniqueID>|<String>
465
466
  <QueryMemberRestrictions> ::= <String>
466
467
  See: https://cloud.google.com/identity/docs/reference/rest/v1beta1/SecuritySettings#MemberRestriction
467
468
  <QueryMobile> ::= <String>
@@ -10,9 +10,24 @@ 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.22.01
13
+ ### - 7.22.04
14
14
 
15
- An update to the httplib2 library caused GAM proxy connections to fail; this has been fixed.
15
+ Added a variant of `gam create vaulthold` that gets its parameters from a saved Vault query.
16
+ ```
17
+ gam create vaulthold matter <MatterItem> [name <String>]
18
+ vaultquery <QueryItem>
19
+ [showdetails|returnidonly]
20
+ ```
21
+
22
+ ### 7.22.03
23
+
24
+ Fix backwards compatability bug introduced in 7.22.00 for `gam print users` that changed `suspended`
25
+ from a field name to a query option; it is now correctly interpreted as a field name.
26
+
27
+ ### 7.22.02
28
+
29
+ An update to the httplib2 library caused GAM proxy connections to fail; this has been fixed
30
+ by including the pysocks library needed by the latest httplib2 library.
16
31
 
17
32
  ### 7.22.00
18
33
 
@@ -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.22.01 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.22.04 - 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 Sequoia 15.6.1 x86_64
@@ -570,17 +570,12 @@ gam config auto_batch_min 1 csv_output_row_filter "owners.0.emailAddress:notrege
570
570
  ### Multiple parents
571
571
  No existing parents are copied for source top/sub files/folders.
572
572
 
573
- ### Removed options
574
- The following options will generate an error; they were removed in 6.23.00:
575
- * `copysubfileparents` and `copysubfolderparents`.
576
-
577
573
  ### Move Folder Permissions
578
- When a folder is moved by recreating it, its permissions are not copied; these options control copying permissions for folders.
574
+ When a folder is moved by recreating it, its permissions are not copied by the Drive API; these options control copying permissions for folders.
579
575
 
580
576
  For options of the form `option [<Boolean>]`; if `<Boolean>` is omitted, `true` is assumed.
581
577
 
582
578
  When recreated, a target folder inherits the permissions of its parent folder; these options control whether/how GAM copies the existing source folder permissions;
583
- The default values of options introduced in version 6.14.00 are set to match the behavior of earlier versions.
584
579
 
585
580
  When `mergewithparent` is `true`:
586
581
  * `copymergewithparentfolderpermissions false` - The permissions of the source top folder are not not copied to the target folder; this is the default action.
@@ -594,7 +589,7 @@ When `duplicatefolders` is `merge` and a sub folder is a duplicate:
594
589
  * `copymergedsubfolderpermissions false` - The permissions of the source sub folder are not not copied to the target folder.
595
590
  * `copymergedsubfolderpermissions true` - The permissions of the source sub folder are copied to the target folder; this is the default action.
596
591
 
597
- When `duplicatefolders` is `duplicatename` or `uniquename` and a top/sub folder is not a duplicate:
592
+ When `duplicatefolders` is `merge` or `duplicatename` or `uniquename` and a top/sub folder is not a duplicate:
598
593
  * `copytopfolderpermissions true` - The permissions of the source top folder are copied to the target folder; this is the default action.
599
594
  * `copytopfolderpermissions false` - The permissions of the source top folder are not not copied to the target folder.
600
595
  * `copysubfolderpermissions true` - The permissions of the source sub folders are copied to the target folder; this is the default action.