gam7 7.19.1__tar.gz → 7.19.2__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 (321) hide show
  1. {gam7-7.19.1 → gam7-7.19.2}/.github/workflows/build.yml +78 -53
  2. {gam7-7.19.1 → gam7-7.19.2}/PKG-INFO +1 -1
  3. {gam7-7.19.1 → gam7-7.19.2}/src/GamUpdate.txt +7 -0
  4. {gam7-7.19.1 → gam7-7.19.2}/src/gam/__init__.py +10 -10
  5. gam7-7.19.2/src/tools/ssd.mjs +125 -0
  6. {gam7-7.19.1 → gam7-7.19.2}/wiki/GamUpdates.md +7 -0
  7. {gam7-7.19.1 → gam7-7.19.2}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  8. {gam7-7.19.1 → gam7-7.19.2}/wiki/Licenses.md +22 -0
  9. {gam7-7.19.1 → gam7-7.19.2}/wiki/Vault-Takeout.md +10 -0
  10. {gam7-7.19.1 → gam7-7.19.2}/wiki/Version-and-Help.md +6 -6
  11. {gam7-7.19.1 → gam7-7.19.2}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  12. {gam7-7.19.1 → gam7-7.19.2}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  13. {gam7-7.19.1 → gam7-7.19.2}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  14. {gam7-7.19.1 → gam7-7.19.2}/.github/ISSUE_TEMPLATE.txt +0 -0
  15. {gam7-7.19.1 → gam7-7.19.2}/.github/actions/decrypt.sh +0 -0
  16. {gam7-7.19.1 → gam7-7.19.2}/.github/actions/entitlements.plist +0 -0
  17. {gam7-7.19.1 → gam7-7.19.2}/.github/actions/package_exclusions.txt +0 -0
  18. {gam7-7.19.1 → gam7-7.19.2}/.github/stale.yml +0 -0
  19. {gam7-7.19.1 → gam7-7.19.2}/.github/workflows/codeql-analysis.yml +0 -0
  20. {gam7-7.19.1 → gam7-7.19.2}/.github/workflows/get-cacerts.yml +0 -0
  21. {gam7-7.19.1 → gam7-7.19.2}/.github/workflows/pushwiki.yml +0 -0
  22. {gam7-7.19.1 → gam7-7.19.2}/.github/workflows/pypi.yml +0 -0
  23. {gam7-7.19.1 → gam7-7.19.2}/.pre-commit-config.yaml +0 -0
  24. {gam7-7.19.1 → gam7-7.19.2}/LICENSE +0 -0
  25. {gam7-7.19.1 → gam7-7.19.2}/README.md +0 -0
  26. {gam7-7.19.1 → gam7-7.19.2}/pyproject.toml +0 -0
  27. {gam7-7.19.1 → gam7-7.19.2}/src/.gitignore +0 -0
  28. {gam7-7.19.1 → gam7-7.19.2}/src/GamCommands.txt +0 -0
  29. {gam7-7.19.1 → gam7-7.19.2}/src/LICENSE +0 -0
  30. {gam7-7.19.1 → gam7-7.19.2}/src/README.md +0 -0
  31. {gam7-7.19.1 → gam7-7.19.2}/src/cacerts.pem +0 -0
  32. {gam7-7.19.1 → gam7-7.19.2}/src/callgam.py +0 -0
  33. {gam7-7.19.1 → gam7-7.19.2}/src/gam/__main__.py +0 -0
  34. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/client.py +0 -0
  37. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/core.py +0 -0
  38. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/data.py +0 -0
  39. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/http.py +0 -0
  40. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/service.py +0 -0
  46. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.19.1 → gam7-7.19.2}/src/gam/atom/url.py +0 -0
  48. {gam7-7.19.1 → gam7-7.19.2}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.19.1 → gam7-7.19.2}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.19.1 → gam7-7.19.2}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.19.1 → gam7-7.19.2}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glapi.py +0 -0
  55. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glcfg.py +0 -0
  56. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glclargs.py +0 -0
  57. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glentity.py +0 -0
  58. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glgapi.py +0 -0
  59. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glgdata.py +0 -0
  60. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glglobals.py +0 -0
  61. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glindent.py +0 -0
  62. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glmsgs.py +0 -0
  63. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glskus.py +0 -0
  64. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/gluprop.py +0 -0
  65. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/glverlibs.py +0 -0
  66. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gamlib/yubikey.py +0 -0
  67. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/__init__.py +0 -0
  68. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/alt/__init__.py +0 -0
  69. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/alt/app_engine.py +0 -0
  70. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/alt/appengine.py +0 -0
  71. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/__init__.py +0 -0
  72. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/audit/__init__.py +0 -0
  73. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/audit/service.py +0 -0
  74. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  75. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/contacts/service.py +0 -0
  76. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/apps/service.py +0 -0
  77. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/service.py +0 -0
  78. {gam7-7.19.1 → gam7-7.19.2}/src/gam/gdata/urlfetch.py +0 -0
  79. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/__init__.py +0 -0
  80. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/_auth.py +0 -0
  81. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/_helpers.py +0 -0
  82. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/channel.py +0 -0
  83. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/discovery.py +0 -0
  84. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  85. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  86. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  87. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  88. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/errors.py +0 -0
  89. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/http.py +0 -0
  90. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/mimeparse.py +0 -0
  91. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/model.py +0 -0
  92. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/schema.py +0 -0
  93. {gam7-7.19.1 → gam7-7.19.2}/src/gam/googleapiclient/version.py +0 -0
  94. {gam7-7.19.1 → gam7-7.19.2}/src/gam/iso8601/__init__.py +0 -0
  95. {gam7-7.19.1 → gam7-7.19.2}/src/gam/iso8601/iso8601.py +0 -0
  96. {gam7-7.19.1 → gam7-7.19.2}/src/gam/meet-v2beta.json +0 -0
  97. {gam7-7.19.1 → gam7-7.19.2}/src/gam/serviceaccountlookup-v1.json +0 -0
  98. {gam7-7.19.1 → gam7-7.19.2}/src/gam/six.py +0 -0
  99. {gam7-7.19.1 → gam7-7.19.2}/src/gam-install.sh +0 -0
  100. {gam7-7.19.1 → gam7-7.19.2}/src/gam-setup.bat +0 -0
  101. {gam7-7.19.1 → gam7-7.19.2}/src/gam.exe.manifest +0 -0
  102. {gam7-7.19.1 → gam7-7.19.2}/src/gam.py +0 -0
  103. {gam7-7.19.1 → gam7-7.19.2}/src/gam.spec +0 -0
  104. {gam7-7.19.1 → gam7-7.19.2}/src/gam.wxs +0 -0
  105. {gam7-7.19.1 → gam7-7.19.2}/src/license.rtf +0 -0
  106. {gam7-7.19.1 → gam7-7.19.2}/src/requirements-dev.txt +0 -0
  107. {gam7-7.19.1 → gam7-7.19.2}/src/tools/a_atleast_b.py +0 -0
  108. {gam7-7.19.1 → gam7-7.19.2}/src/tools/gen-wix-xml-filelist.py +0 -0
  109. {gam7-7.19.1 → gam7-7.19.2}/src/tools/mkGamRef.py +0 -0
  110. {gam7-7.19.1 → gam7-7.19.2}/src/tools/openssl.props +0 -0
  111. {gam7-7.19.1 → gam7-7.19.2}/src/version_info.txt.in +0 -0
  112. {gam7-7.19.1 → gam7-7.19.2}/wiki/00scratch.md +0 -0
  113. {gam7-7.19.1 → gam7-7.19.2}/wiki/Addresses.md +0 -0
  114. {gam7-7.19.1 → gam7-7.19.2}/wiki/Administrators.md +0 -0
  115. {gam7-7.19.1 → gam7-7.19.2}/wiki/Alert-Center.md +0 -0
  116. {gam7-7.19.1 → gam7-7.19.2}/wiki/Aliases.md +0 -0
  117. {gam7-7.19.1 → gam7-7.19.2}/wiki/Authorization.md +0 -0
  118. {gam7-7.19.1 → gam7-7.19.2}/wiki/BNF-Syntax.md +0 -0
  119. {gam7-7.19.1 → gam7-7.19.2}/wiki/Basic-Items.md +0 -0
  120. {gam7-7.19.1 → gam7-7.19.2}/wiki/Bulk-Processing.md +0 -0
  121. {gam7-7.19.1 → gam7-7.19.2}/wiki/Business-Account-Management.md +0 -0
  122. {gam7-7.19.1 → gam7-7.19.2}/wiki/CSV-Input-Filtering.md +0 -0
  123. {gam7-7.19.1 → gam7-7.19.2}/wiki/CSV-Output-Filtering.md +0 -0
  124. {gam7-7.19.1 → gam7-7.19.2}/wiki/CSV-Special-Characters.md +0 -0
  125. {gam7-7.19.1 → gam7-7.19.2}/wiki/Calendars-Access.md +0 -0
  126. {gam7-7.19.1 → gam7-7.19.2}/wiki/Calendars-Events.md +0 -0
  127. {gam7-7.19.1 → gam7-7.19.2}/wiki/Calendars.md +0 -0
  128. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chat-Bot-Setup-Use.md +0 -0
  129. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-AUE-Counts.md +0 -0
  130. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  131. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Installed-Apps.md +0 -0
  132. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  133. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Policies.md +0 -0
  134. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Printers.md +0 -0
  135. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Profile-Management.md +0 -0
  136. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Version-Counts.md +0 -0
  137. {gam7-7.19.1 → gam7-7.19.2}/wiki/Chrome-Version-History.md +0 -0
  138. {gam7-7.19.1 → gam7-7.19.2}/wiki/ChromeOS-Devices.md +0 -0
  139. {gam7-7.19.1 → gam7-7.19.2}/wiki/Classroom-Courses.md +0 -0
  140. {gam7-7.19.1 → gam7-7.19.2}/wiki/Classroom-Guardians.md +0 -0
  141. {gam7-7.19.1 → gam7-7.19.2}/wiki/Classroom-Invitations.md +0 -0
  142. {gam7-7.19.1 → gam7-7.19.2}/wiki/Classroom-Membership.md +0 -0
  143. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Channel.md +0 -0
  144. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Identity-Devices.md +0 -0
  145. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  146. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Identity-Groups.md +0 -0
  147. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Identity-Policies.md +0 -0
  148. {gam7-7.19.1 → gam7-7.19.2}/wiki/Cloud-Storage.md +0 -0
  149. {gam7-7.19.1 → gam7-7.19.2}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  150. {gam7-7.19.1 → gam7-7.19.2}/wiki/Collections-of-Items.md +0 -0
  151. {gam7-7.19.1 → gam7-7.19.2}/wiki/Collections-of-Users.md +0 -0
  152. {gam7-7.19.1 → gam7-7.19.2}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  153. {gam7-7.19.1 → gam7-7.19.2}/wiki/Command-Line-Parsing.md +0 -0
  154. {gam7-7.19.1 → gam7-7.19.2}/wiki/Command-Logging-Progress.md +0 -0
  155. {gam7-7.19.1 → gam7-7.19.2}/wiki/Context-Aware-Access-Levels.md +0 -0
  156. {gam7-7.19.1 → gam7-7.19.2}/wiki/Customer.md +0 -0
  157. {gam7-7.19.1 → gam7-7.19.2}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  158. {gam7-7.19.1 → gam7-7.19.2}/wiki/Domain-SharedContacts.md +0 -0
  159. {gam7-7.19.1 → gam7-7.19.2}/wiki/Domains-Verification.md +0 -0
  160. {gam7-7.19.1 → gam7-7.19.2}/wiki/Domains.md +0 -0
  161. {gam7-7.19.1 → gam7-7.19.2}/wiki/Downloads-Installs.md +0 -0
  162. {gam7-7.19.1 → gam7-7.19.2}/wiki/Drive-File-Selection.md +0 -0
  163. {gam7-7.19.1 → gam7-7.19.2}/wiki/Drive-Items.md +0 -0
  164. {gam7-7.19.1 → gam7-7.19.2}/wiki/Drive-REST-API-v3.md +0 -0
  165. {gam7-7.19.1 → gam7-7.19.2}/wiki/Email-Audit-Monitor.md +0 -0
  166. {gam7-7.19.1 → gam7-7.19.2}/wiki/Find-File-Owner.md +0 -0
  167. {gam7-7.19.1 → gam7-7.19.2}/wiki/GAM-Public-Chat-Room.md +0 -0
  168. {gam7-7.19.1 → gam7-7.19.2}/wiki/GAM-Return-Codes.md +0 -0
  169. {gam7-7.19.1 → gam7-7.19.2}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  170. {gam7-7.19.1 → gam7-7.19.2}/wiki/GAM7-on-Android-Devices.md +0 -0
  171. {gam7-7.19.1 → gam7-7.19.2}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  172. {gam7-7.19.1 → gam7-7.19.2}/wiki/Global-Address-List.md +0 -0
  173. {gam7-7.19.1 → gam7-7.19.2}/wiki/Google-Data-Transfers.md +0 -0
  174. {gam7-7.19.1 → gam7-7.19.2}/wiki/Google-Network-Addresses.md +0 -0
  175. {gam7-7.19.1 → gam7-7.19.2}/wiki/Groups-Membership.md +0 -0
  176. {gam7-7.19.1 → gam7-7.19.2}/wiki/Groups.md +0 -0
  177. {gam7-7.19.1 → gam7-7.19.2}/wiki/HTTPS-Proxy.md +0 -0
  178. {gam7-7.19.1 → gam7-7.19.2}/wiki/Home.md +0 -0
  179. {gam7-7.19.1 → gam7-7.19.2}/wiki/How-to-Install-GAM7.md +0 -0
  180. {gam7-7.19.1 → gam7-7.19.2}/wiki/How-to-Uninstall-GAM7.md +0 -0
  181. {gam7-7.19.1 → gam7-7.19.2}/wiki/How-to-Update-GAM7.md +0 -0
  182. {gam7-7.19.1 → gam7-7.19.2}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  183. {gam7-7.19.1 → gam7-7.19.2}/wiki/Inbound-SSO.md +0 -0
  184. {gam7-7.19.1 → gam7-7.19.2}/wiki/Install-GAM-as-Python-Library.md +0 -0
  185. {gam7-7.19.1 → gam7-7.19.2}/wiki/List-Items.md +0 -0
  186. {gam7-7.19.1 → gam7-7.19.2}/wiki/List.md +0 -0
  187. {gam7-7.19.1 → gam7-7.19.2}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  188. {gam7-7.19.1 → gam7-7.19.2}/wiki/Mobile-Devices.md +0 -0
  189. {gam7-7.19.1 → gam7-7.19.2}/wiki/Organizational-Units.md +0 -0
  190. {gam7-7.19.1 → gam7-7.19.2}/wiki/Other-Resources.md +0 -0
  191. {gam7-7.19.1 → gam7-7.19.2}/wiki/Permission-Matches.md +0 -0
  192. {gam7-7.19.1 → gam7-7.19.2}/wiki/Python-Regular-Expressions.md +0 -0
  193. {gam7-7.19.1 → gam7-7.19.2}/wiki/README.md +0 -0
  194. {gam7-7.19.1 → gam7-7.19.2}/wiki/Rclone.md +0 -0
  195. {gam7-7.19.1 → gam7-7.19.2}/wiki/Reports.md +0 -0
  196. {gam7-7.19.1 → gam7-7.19.2}/wiki/Reseller.md +0 -0
  197. {gam7-7.19.1 → gam7-7.19.2}/wiki/Resources.md +0 -0
  198. {gam7-7.19.1 → gam7-7.19.2}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  199. {gam7-7.19.1 → gam7-7.19.2}/wiki/SSL-Root-CA-Certificates.md +0 -0
  200. {gam7-7.19.1 → gam7-7.19.2}/wiki/Schemas.md +0 -0
  201. {gam7-7.19.1 → gam7-7.19.2}/wiki/Scripts.md +0 -0
  202. {gam7-7.19.1 → gam7-7.19.2}/wiki/Send-Email.md +0 -0
  203. {gam7-7.19.1 → gam7-7.19.2}/wiki/Shared-Drives.md +0 -0
  204. {gam7-7.19.1 → gam7-7.19.2}/wiki/Sites.md +0 -0
  205. {gam7-7.19.1 → gam7-7.19.2}/wiki/Tag-Replace.md +0 -0
  206. {gam7-7.19.1 → gam7-7.19.2}/wiki/Todrive.md +0 -0
  207. {gam7-7.19.1 → gam7-7.19.2}/wiki/Unmanaged-Accounts.md +0 -0
  208. {gam7-7.19.1 → gam7-7.19.2}/wiki/Upgrade-Benefits.md +0 -0
  209. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Analytics-Admin.md +0 -0
  210. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Application-Specific-Passwords.md +0 -0
  211. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Backup-Verification-Codes.md +0 -0
  212. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Calendars-Access.md +0 -0
  213. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Calendars-Events.md +0 -0
  214. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Calendars.md +0 -0
  215. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Chat.md +0 -0
  216. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Classification-Labels.md +0 -0
  217. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Classroom-Profile.md +0 -0
  218. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Contacts-Delegates.md +0 -0
  219. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Contacts.md +0 -0
  220. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Deprovision.md +0 -0
  221. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Activity-Settings.md +0 -0
  222. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Cleanup.md +0 -0
  223. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Comments.md +0 -0
  224. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Copy-Move.md +0 -0
  225. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Files-Display.md +0 -0
  226. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Files-Manage.md +0 -0
  227. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Orphans.md +0 -0
  228. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Ownership.md +0 -0
  229. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Permissions.md +0 -0
  230. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Query.md +0 -0
  231. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Revisions.md +0 -0
  232. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Shortcuts.md +0 -0
  233. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Drive-Transfer.md +0 -0
  234. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Forms.md +0 -0
  235. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-CSE.md +0 -0
  236. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Delegates.md +0 -0
  237. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Filters.md +0 -0
  238. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Forwarding.md +0 -0
  239. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Labels.md +0 -0
  240. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  241. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Profile.md +0 -0
  242. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-S-MIME.md +0 -0
  243. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  244. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Gmail-Settings.md +0 -0
  245. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Group-Membership.md +0 -0
  246. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Keep-Notes.md +0 -0
  247. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Looker-Studio.md +0 -0
  248. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Meet.md +0 -0
  249. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-People-Contacts-Profiles.md +0 -0
  250. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Photo.md +0 -0
  251. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Profile-Photo.md +0 -0
  252. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Profile-Sharing.md +0 -0
  253. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Shared-Drives.md +0 -0
  254. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  255. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Spreadsheets.md +0 -0
  256. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Tag-Manager.md +0 -0
  257. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Tasks.md +0 -0
  258. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Tokens.md +0 -0
  259. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-Web-Resources-and-Sites.md +0 -0
  260. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users-YouTube.md +0 -0
  261. {gam7-7.19.1 → gam7-7.19.2}/wiki/Users.md +0 -0
  262. {gam7-7.19.1 → gam7-7.19.2}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  263. {gam7-7.19.1 → gam7-7.19.2}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  264. {gam7-7.19.1 → gam7-7.19.2}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  265. {gam7-7.19.1 → gam7-7.19.2}/wiki/_Sidebar.md +0 -0
  266. {gam7-7.19.1 → gam7-7.19.2}/wiki/gam.cfg.md +0 -0
  267. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-AdminSettingsExamples.md +0 -0
  268. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Android-Installation.md +0 -0
  269. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-BulkOperations.md +0 -0
  270. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-CalendarExamples.md +0 -0
  271. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Chat-Bot.md +0 -0
  272. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Chrome-Browser-Management.md +0 -0
  273. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Chrome-OS-Installation.md +0 -0
  274. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Chrome-Policy-Settings.md +0 -0
  275. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Cloud-Identity-Groups.md +0 -0
  276. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  277. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Calendars.md +0 -0
  278. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Definitions.md +0 -0
  279. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Drive.md +0 -0
  280. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Email.md +0 -0
  281. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  282. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Groups.md +0 -0
  283. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Command-Reference-Users.md +0 -0
  284. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  285. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  286. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-CreatingClientSecretsFile.md +0 -0
  287. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Custom-Schemas.md +0 -0
  288. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Data-Transfers.md +0 -0
  289. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-DomainVerification.md +0 -0
  290. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-ExamplesAccountAuditing.md +0 -0
  291. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-ExamplesCSV.md +0 -0
  292. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-ExamplesEmailSettings.md +0 -0
  293. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-ExamplesOrganizations.md +0 -0
  294. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM-Discussion-Group.md +0 -0
  295. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  296. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM-options-files.md +0 -0
  297. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  298. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM3CSVListings.md +0 -0
  299. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM3DirectoryCommands.md +0 -0
  300. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM3GroupSettings.md +0 -0
  301. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GAM7-FAQ.md +0 -0
  302. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  303. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-GoogleDriveManagement.md +0 -0
  304. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  305. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Home.md +0 -0
  306. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  307. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Inbound-SSO-Settings.md +0 -0
  308. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-LicenseExamples.md +0 -0
  309. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Managing-Admins.md +0 -0
  310. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  311. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Managing-Devices.md +0 -0
  312. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Managing-Google-Classroom.md +0 -0
  313. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-OAuthKeyManagement.md +0 -0
  314. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Printers.md +0 -0
  315. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-ResellerCommands.md +0 -0
  316. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  317. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-SecurityExamples.md +0 -0
  318. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-UnmanagedUsersExamples.md +0 -0
  319. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Use-a-Yubikey.md +0 -0
  320. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  321. {gam7-7.19.1 → gam7-7.19.2}/wiki/l-_Footer.md +0 -0
@@ -30,6 +30,7 @@ env:
30
30
  PYTHON_SOURCE_PATH: ${{ github.workspace }}/src/cpython
31
31
  CRYPTOGRAPHY_BUILD_OPENSSL_NO_LEGACY: 1
32
32
  CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
33
+ WINDOWS_CODESIGN_CERT_HASH: 590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e
33
34
 
34
35
  jobs:
35
36
  build:
@@ -76,7 +77,7 @@ jobs:
76
77
  jid: 9
77
78
  goal: build
78
79
  name: Build Arm MacOS 15
79
- - os: windows-2022
80
+ - os: windows-2025
80
81
  jid: 10
81
82
  goal: build
82
83
  name: Build Intel Windows
@@ -593,6 +594,72 @@ jobs:
593
594
  echo "GAM Version ${GAMVERSION}"
594
595
  echo "GAMVERSION=${GAMVERSION}" >> $GITHUB_ENV
595
596
 
597
+ - name: Install WinAppDriver
598
+ if: runner.os == 'Windows'
599
+ run: |
600
+ choco install -y winappdriver
601
+
602
+ - name: Enabled dev mode for WinAppDriver
603
+ if: runner.os == 'Windows'
604
+ shell: cmd
605
+ run : |
606
+ reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
607
+
608
+ - name: Install appium and totp tools
609
+ if: runner.os == 'Windows'
610
+ run: |
611
+ echo "Installing appium..."
612
+ npm install -g appium
613
+ echo "Installing totp-generator..."
614
+ npm install "totp-generator"
615
+ echo "Installing wdio..."
616
+ npm install @wdio/cli
617
+ echo "Installing appium win driver..."
618
+ appium driver install windows
619
+
620
+ - name: Install Certum MSI
621
+ if: runner.os == 'Windows'
622
+ shell: pwsh
623
+ run: |
624
+ $url = "https://files.certum.eu/software/SimplySignDesktop/Windows/9.3.2.67/SimplySignDesktop-9.3.2.67-64-bit-en.msi"
625
+ $file = "SimplySignDesktop-9.3.2.67-64-bit-en.msi"
626
+ Invoke-WebRequest $url -OutFile $file
627
+ $log = "install.log"
628
+ $procMain = Start-Process "msiexec" "/i `"$file`" /qn /l*! `"$log`"" -NoNewWindow -PassThru
629
+ $procLog = Start-Process "powershell" "Get-Content -Path `"$log`" -Wait" -NoNewWindow -PassThru
630
+ $procMain.WaitForExit()
631
+ $procLog.Kill()
632
+
633
+ - name: Login to Certum
634
+ if: runner.os == 'Windows'
635
+ shell: pwsh
636
+ env:
637
+ TOTP_SECRET: ${{ secrets.TOTP_SECRET }}
638
+ run: |
639
+ # disable win private firewall that interferes with appium server
640
+ Set-NetFirewallProfile -Profile Private -Enabled False
641
+ $appiumCmd = Get-Command appium
642
+ $appiumPath = $appiumCmd.Path
643
+ Start-Process -Filepath "powershell.exe" -ArgumentList "-File", $appiumPath, "--address", "127.0.0.1", "--log-level", "error"
644
+ Start-Sleep -Seconds 10
645
+ write-host "appium started"
646
+ write-host "running SimplySignDesktop login..."
647
+ node tools/ssd.mjs --log-level warn
648
+ write-host "sleeping during login..."
649
+ Start-Sleep 10
650
+
651
+ - name: Sign gam.exe
652
+ if: runner.os == 'Windows'
653
+ shell: pwsh
654
+ run: |
655
+ write-Host "Signing ${env:gam}...."
656
+ # Always explicitely use x64 version os signtool.exe, arm64 version apparently can't
657
+ # see Certum certs since SimplySignDesktop is x64-only today.
658
+ Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:gam"
659
+ write-Host "Verifying signature of ${env:gam}...."
660
+ # verify signature. If we failed to sign we should fail to verify and die.
661
+ & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' verify /pa /v "$env:gam"
662
+
596
663
  - name: Configure user and service account auth
597
664
  id: configserviceaccount
598
665
  env:
@@ -601,34 +668,6 @@ jobs:
601
668
  ../.github/actions/decrypt.sh "${GAMCFGDIR}"
602
669
  $gam create signjwtserviceaccount
603
670
 
604
- - name: Upload gam.exe Windows for signing
605
- if: runner.os == 'Windows' && matrix.goal != 'test'
606
- run: |
607
- export folder_number=$(date +%s)
608
- export folder_id=$($gam user gam-win-signer@pdl.jaylee.us add drivefile drivefilename "UPLOADING_FOR_SIGN ${folder_number}" parentid "1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp" mimetype gfolder returnidonly)
609
- $gam user gam-win-signer@pdl.jaylee.us add drivefile localfile "$gam" parentid "$folder_id"
610
- $gam user gam-win-signer@pdl.jaylee.us update drivefile "$folder_id" newfilename "READYTOSIGN ${folder_number}"
611
- export signed_folder="SIGNED ${folder_number}"
612
- zero_results="gam-win-signer@pdl.jaylee.us,0"
613
- while true; do
614
- result_counts=$($gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" countsonly)
615
- echo "$result_counts"
616
- if [[ ! "$result_counts" =~ "$zero_results" ]]; then
617
- echo "looks like we have results"
618
- break
619
- fi
620
- echo "no results, sleeping 10..."
621
- sleep 10
622
- done
623
- # download signed gam.exe
624
- $gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us print filelist query "'~~id~~' in parents and name = 'gam.exe'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us get drivefile ~id targetfolder "$gampath" targetname "signed-gam.exe" overwrite true acknowledgeabuse true
625
- # delete signed folder on drive
626
- $gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us trash drivefile "~id"
627
- # remove unsigned gam.exe and rename signed-gam.exe
628
- rm -v -f "${gampath}/gam.exe"
629
- mv -v -f "${gampath}/signed-gam.exe" "${gampath}/gam.exe"
630
- #"/c/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/signtool.exe" verify /v /pa "$gam"
631
-
632
671
  - name: Attest gam executable was generated from this Action
633
672
  uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # 2.4.0
634
673
  if: matrix.goal == 'build'
@@ -681,31 +720,17 @@ jobs:
681
720
  rm -v -f *.wixobj
682
721
  echo "MSI_FILENAME=${MSI_FILENAME}" >> $GITHUB_ENV
683
722
 
684
- - name: Upload gam MSI Windows for signing
685
- if: runner.os == 'Windows' && matrix.goal != 'test'
723
+ - name: Sign GAM MSI
724
+ if: runner.os == 'Windows'
725
+ shell: pwsh
686
726
  run: |
687
- export folder_number=$(date +%s)
688
- export folder_id=$($gam user gam-win-signer@pdl.jaylee.us add drivefile drivefilename "UPLOADING_FOR_SIGN ${folder_number}" parentid "1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp" mimetype gfolder returnidonly)
689
- $gam user gam-win-signer@pdl.jaylee.us add drivefile localfile "$MSI_FILENAME" parentid "$folder_id"
690
- rm -f -v "$MSI_FILENAME"
691
- $gam user gam-win-signer@pdl.jaylee.us update drivefile "$folder_id" newfilename "READYTOSIGN ${folder_number}"
692
- export signed_folder="SIGNED ${folder_number}"
693
- zero_results="gam-win-signer@pdl.jaylee.us,0"
694
- while true; do
695
- result_counts=$($gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" countsonly)
696
- echo "$result_counts"
697
- if [[ ! "$result_counts" =~ "$zero_results" ]]; then
698
- echo "looks like we have results"
699
- break
700
- fi
701
- echo "no results, sleeping 10..."
702
- sleep 10
703
- done
704
- # download signed package
705
- $gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us print filelist query "'~~id~~' in parents and name contains '.msi'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us get drivefile ~id targetfolder "$GITHUB_WORKSPACE" targetname "$MSI_FILENAME" overwrite true acknowledgeabuse true
706
- # delete signed folder on drive
707
- $gam user gam-win-signer@pdl.jaylee.us print filelist query "name = '${signed_folder}' and '1Xz3hYq4Mfa_r6D8EcBZHLDtHDFurYSvp' in parents and mimeType = 'application/vnd.google-apps.folder'" id | $gam csv - gam user gam-win-signer@pdl.jaylee.us trash drivefile "~id"
708
- #"/c/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/signtool.exe" verify /v /pa "$MSI_FILENAME"
727
+ write-Host "Signing ${env:MSI_FILENAME}...."
728
+ # Always explicitely use x64 version os signtool.exe, arm64 version apparently can't
729
+ # see Certum certs since SimplySignDesktop is x64-only today.
730
+ Start-Process -Wait -NoNewWindow -ErrorAction Continue -FilePath 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' -ArgumentList "sign", "/sha1", "590dc5bb10dfb31dbff38c0e2f9c35ef0f6d0e9e", "/tr", "http://time.certum.pl", "/td", "SHA256", "/fd", "SHA256", "/v", "$env:MSI_FILENAME"
731
+ write-Host "Verifying signature of ${env:MSI_FILENAME}...."
732
+ # verify signature. If we failed to sign we should fail to verify and die.
733
+ & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe' verify /pa /v "$env:MSI_FILENAME"
709
734
 
710
735
  - name: Attest that gam package files were generated from this Action
711
736
  uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # 2.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.19.1
3
+ Version: 7.19.2
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
@@ -1,3 +1,10 @@
1
+ 7.19.02
2
+
3
+ Update `gam info user <UserItem>` to eliminate 5 second delay when getting license info.
4
+
5
+ Additional information:
6
+ * See: https://github.com/GAM-team/GAM/wiki/Licenses#info-user-performance
7
+
1
8
  7.19.01
2
9
 
3
10
  Updated `gam <UserTypeEntity> print|show signature` to handle the following error
@@ -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.19.01'
28
+ __version__ = '7.19.02'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -32228,9 +32228,9 @@ def doUpdateMobileDevices():
32228
32228
  [Msg.ACTION_APPLIED, body['action']], i, count)
32229
32229
  except GAPI.internalError:
32230
32230
  entityActionFailedWarning([Ent.MOBILE_DEVICE, resourceId], Msg.DOES_NOT_EXIST, i, count)
32231
- except (GAPI.resourceIdNotFound, GAPI.badRequest, GAPI.resourceNotFound) as e:
32231
+ except (GAPI.resourceIdNotFound, GAPI.badRequest, GAPI.resourceNotFound, GAPI.forbidden) as e:
32232
32232
  entityActionFailedWarning([Ent.MOBILE_DEVICE, resourceId], str(e), i, count)
32233
- except (GAPI.forbidden, GAPI.permissionDenied) as e:
32233
+ except GAPI.permissionDenied as e:
32234
32234
  ClientAPIAccessDeniedExit(str(e))
32235
32235
 
32236
32236
  # gam delete mobile|mobiles <MobileDeviceEntity>
@@ -44907,6 +44907,12 @@ def waitForMailbox(entityList):
44907
44907
  Ind.Decrement()
44908
44908
 
44909
44909
  def getUserLicenses(lic, user, skus):
44910
+ reasons_to_quit = [
44911
+ GAPI.ACCESS_NOT_CONFIGURED, # license API not turned on
44912
+ GAPI.PERMISSION_DENIED, # Admin doesn't have rights to license assignments
44913
+ GAPI.NOT_FOUND # API call succeeded, user does not have this license
44914
+ ]
44915
+
44910
44916
  def _callbackGetLicense(request_id, response, exception):
44911
44917
  if exception is None:
44912
44918
  if response and 'skuId' in response:
@@ -44914,18 +44920,12 @@ def getUserLicenses(lic, user, skus):
44914
44920
  del sku_calls[request_id]
44915
44921
  else:
44916
44922
  _, reason, _ = checkGAPIError(exception, softErrors=True)
44917
- reasons_to_quit = [
44918
- GAPI.ACCESS_NOT_CONFIGURED, # license API not turned on
44919
- GAPI.PERMISSION_DENIED, # Admin doesn't have rights to license assignments
44920
- GAPI.NOT_FOUND # API call succeeded, user does not have this license
44921
- ]
44922
44923
  if reason in reasons_to_quit:
44923
44924
  del sku_calls[request_id]
44924
44925
 
44925
44926
  licenses = []
44926
44927
  svcargs = dict([('userId', user['primaryEmail']), ('productId', None), ('skuId', None), ('fields', 'skuId')]+GM.Globals[GM.EXTRA_ARGS_LIST])
44927
44928
  method = getattr(lic.licenseAssignments(), 'get')
44928
- dbatch = lic.new_batch_http_request(callback=_callbackGetLicense)
44929
44929
  sku_calls = {}
44930
44930
  for sku in skus:
44931
44931
  svcparms = svcargs.copy()
@@ -44944,7 +44944,7 @@ def getUserLicenses(lic, user, skus):
44944
44944
  if try_count >= 5:
44945
44945
  # give up and return what we have
44946
44946
  return licenses
44947
- time.sleep(5)
44947
+ time.sleep(5)
44948
44948
  return licenses
44949
44949
 
44950
44950
  USER_NAME_PROPERTY_PRINT_ORDER = [
@@ -0,0 +1,125 @@
1
+ // Node.js script that implements an Appium client which will launch
2
+ // Simply Sign Desktop app and log a user in. Once logged in it should
3
+ // be possible to use tools like signtool.exe to sign Windows EXE/MSI files
4
+ // with the Certum certificate.
5
+
6
+ import { Key, remote } from 'webdriverio';
7
+ import { exec } from 'child_process';
8
+ import { TOTP } from 'totp-generator';
9
+
10
+ async function screenshot(driver, filename) {
11
+ // uncomment to save .png screenshots
12
+ //await driver.saveScreenshot(filename);
13
+ return
14
+ }
15
+
16
+ function sleep(ms) {
17
+ return new Promise(resolve => setTimeout(resolve, ms));
18
+ }
19
+
20
+ async function executeCommand(command) {
21
+ try {
22
+ let { stdout, stderr } = await exec(command);
23
+ return stdout;
24
+ } catch (error) {
25
+ console.error(`Error executing command: ${command}`);
26
+ console.error(`Error details: ${error}`);
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ async function runSSD() {
32
+ const opts = {
33
+ port: 4723,
34
+ logLevel: "silent",
35
+ capabilities: {
36
+ platformName: "Windows",
37
+ "appium:app": "C:\\Program Files\\Certum\\SimplySign Desktop\\SimplySignDesktop.exe",
38
+ "appium:automationName": "Windows",
39
+ },
40
+ };
41
+
42
+ let driver;
43
+ try {
44
+ driver = await remote(opts);
45
+
46
+ // Github Actions Win ARM64 is stuck on a OOB screen that steals focus
47
+ // These enter / escapes should dismiss it.
48
+ const runner_arch = process.env.RUNNER_ARCH;
49
+ if ( runner_arch === "ARM64" ) {
50
+ console.log('Running on ARM64...');
51
+ await sleep(3000); // Pause execution for 3 seconds
52
+ await screenshot(driver, 'oob1.png');
53
+ await driver.sendKeys([Key.Enter]);
54
+ await sleep(3000); // Pause execution for 3 seconds
55
+ await screenshot(driver, 'oob2.png');
56
+ await driver.sendKeys([Key.Enter]);
57
+ await sleep(3000); // Pause execution for 3 seconds
58
+ await screenshot(driver, 'oob3.png');
59
+ await driver.sendKeys([Key.Escape]);
60
+ await screenshot(driver, 'oob6.png');
61
+ } else {
62
+ console.log('NOT running on ARM64');
63
+ }
64
+
65
+ // Execute SSD again to open login dialog
66
+ exec('"C:\\Program Files\\Certum\\SimplySign Desktop\\SimplySignDesktop.exe"', (error, stdout, stderr) => {
67
+ if (error) {
68
+ console.error(`exec error: ${error}`);
69
+ return;
70
+ }
71
+ });
72
+ await sleep(3000);
73
+
74
+ // Login
75
+ const windows = await driver.getWindowHandles();
76
+ const login_window = windows[0]
77
+ await driver.switchWindow(login_window);
78
+ await screenshot(driver, 'login01.png');
79
+ const id_value = 'jay0lee@gmail.com';
80
+ const id_arr = [...id_value];
81
+ await driver.sendKeys(id_arr);
82
+ await screenshot(driver, 'login02.png');
83
+ await driver.sendKeys([Key.Tab]);
84
+ // We wait until the last possible second to generate
85
+ // our TOTP to ensure it's still valid.
86
+ const token_value = TOTP.generate(process.env.TOTP_SECRET, {algorithm: 'SHA-256'}).otp;
87
+ const token_arr = [...token_value];
88
+ await driver.sendKeys(token_arr);
89
+ await screenshot(driver, 'login03.png');
90
+ await driver.sendKeys([Key.Enter]);
91
+
92
+ // TODO: it's expected that on successful login the window
93
+ // will close and these screenshots will error out. Figure
94
+ // out how to handle that gracefully.
95
+ await screenshot(driver, 'login04.png');
96
+ await sleep(500);
97
+ await screenshot(driver, 'login05.png');
98
+ await sleep(500);
99
+ await screenshot(driver, 'login06.png');
100
+ await sleep(500);
101
+ await screenshot(driver, 'login07.png');
102
+ await sleep(500);
103
+ await screenshot(driver, 'login08.png');
104
+ await sleep(500);
105
+ await screenshot(driver, 'login09.png');
106
+ await sleep(500);
107
+ await screenshot(driver, 'login10.png');
108
+ await sleep(500);
109
+ await screenshot(driver, 'login11.png');
110
+ await sleep(500);
111
+ await screenshot(driver, 'login12.png');
112
+
113
+ } catch (error) {
114
+ console.error("Error during Appium run:", error.name);
115
+ }
116
+
117
+ // INTENTIONAL Keep driver open so tray icon for Certum doesn't close
118
+ // finally {
119
+ // if (driver) {
120
+ // await driver.deleteSession(); // Close the Appium session
121
+ // }
122
+ //}
123
+ }
124
+
125
+ runSSD();
@@ -10,6 +10,13 @@ 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.19.02
14
+
15
+ Update `gam info user <UserItem>` to eliminate 5 second delay when getting license info.
16
+
17
+ Additional information:
18
+ * See: https://github.com/GAM-team/GAM/wiki/Licenses#info-user-performance
19
+
13
20
  ### 7.19.01
14
21
 
15
22
  Updated `gam <UserTypeEntity> print|show signature` to handle the following error
@@ -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.19.01 - https://github.com/GAM-team/GAM - pyinstaller
255
+ GAM 7.19.02 - 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
@@ -990,7 +990,7 @@ writes the credentials into the file oauth2.txt.
990
990
  C:\>del C:\GAMConfig\oauth2.txt
991
991
  C:\>gam version
992
992
  WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
993
- GAM 7.19.01 - https://github.com/GAM-team/GAM - pythonsource
993
+ GAM 7.19.02 - https://github.com/GAM-team/GAM - pythonsource
994
994
  GAM Team <google-apps-manager@googlegroups.com>
995
995
  Python 3.13.7 64-bit final
996
996
  Windows-10-10.0.17134 AMD64
@@ -3,6 +3,7 @@
3
3
  - [License Products and SKUs](#license-products-and-skus)
4
4
  - [Definitions](#definitions)
5
5
  - [Notes](#Notes)
6
+ - [Info User Performance](#info-user-performance)
6
7
  - [Display license counts](#display-license-counts)
7
8
  - [Display licenses](#display-licenses)
8
9
  - [Add licenses](#add-licenses)
@@ -233,6 +234,27 @@ nv:<String>:<String>
233
234
  ```
234
235
  The first `<String>` is a Product and the second `<String>` is a SKU.
235
236
 
237
+ ## Info User Performance
238
+
239
+ In GAM versions prior 7.18.05, when you did `gam info user`, GAM would make one attempt to get the user's licenses.
240
+ If something went wrong, you might not get the complete list.
241
+
242
+ The License Manager API doesn't have a call that returns the list of licenses that a user has; you have to ask:
243
+ ```
244
+ Does user have license SKU 1?
245
+ Does user have license SKU 2?
246
+ Does user have license SKU 3?
247
+ ...
248
+ Does user have license SKU 73?
249
+ ```
250
+ If you do a couple of info user commands back to back, you start to run into quota issues.
251
+
252
+ You can help yourself in the following way: generate a list of all of the SKUs that exist in your workspace.
253
+
254
+ Then do (example, use actual list): gam config license_skus 1010020028,1010070001, ... save
255
+ Now, rather that asking 73 questions per user, GAM will only ask about the license SKUs in the list.
256
+ It is much less likely that quota issues will occur,
257
+
236
258
  ## Display license counts
237
259
  ```
238
260
  gam show licenses
@@ -39,6 +39,16 @@
39
39
  [Collections of Items](Collections-of-Items)
40
40
  ```
41
41
  <AttendeeStatus> ::= accepted|declined|needsaction|tentative
42
+ <Date> ::=
43
+ <Year>-<Month>-<Day> |
44
+ (+|-)<Number>(d|w|y) |
45
+ never|
46
+ today
47
+ <Time> ::=
48
+ <Year>-<Month>-<Day>(<Space>|T)<Hour>:<Minute>:<Second>[.<MilliSeconds>](Z|(+|-(<Hour>:<Minute>))) |
49
+ (+|-)<Number>(m|h|d|w|y) |
50
+ never|
51
+ now|today
42
52
  <EmailItem> ::= <EmailAddress>|<UniqueID>|<String>
43
53
  <EmailItemList> ::= "<EmailItem>(,<EmailItem>)*"
44
54
  <EmailAddressList> ::= "<EmailAddess>(,<EmailAddress>)*"
@@ -3,7 +3,7 @@
3
3
  Print the current version of Gam with details
4
4
  ```
5
5
  gam version
6
- GAM 7.19.01 - https://github.com/GAM-team/GAM - pyinstaller
6
+ GAM 7.19.02 - https://github.com/GAM-team/GAM - pyinstaller
7
7
  GAM Team <google-apps-manager@googlegroups.com>
8
8
  Python 3.13.7 64-bit final
9
9
  MacOS Sequoia 15.6.1 x86_64
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
15
15
  Print the current version of Gam with details and time offset information
16
16
  ```
17
17
  gam version timeoffset
18
- GAM 7.19.01 - https://github.com/GAM-team/GAM - pyinstaller
18
+ GAM 7.19.02 - https://github.com/GAM-team/GAM - pyinstaller
19
19
  GAM Team <google-apps-manager@googlegroups.com>
20
20
  Python 3.13.7 64-bit final
21
21
  MacOS Sequoia 15.6.1 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
27
27
  Print the current version of Gam with extended details and SSL information
28
28
  ```
29
29
  gam version extended
30
- GAM 7.19.01 - https://github.com/GAM-team/GAM - pyinstaller
30
+ GAM 7.19.02 - https://github.com/GAM-team/GAM - pyinstaller
31
31
  GAM Team <google-apps-manager@googlegroups.com>
32
32
  Python 3.13.7 64-bit final
33
33
  MacOS Sequoia 15.6.1 x86_64
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
64
64
  Path: /Users/Admin/bin/gam7
65
65
  Version Check:
66
66
  Current: 5.35.08
67
- Latest: 7.19.01
67
+ Latest: 7.19.02
68
68
  echo $?
69
69
  1
70
70
  ```
@@ -72,7 +72,7 @@ echo $?
72
72
  Print the current version number without details
73
73
  ```
74
74
  gam version simple
75
- 7.19.01
75
+ 7.19.02
76
76
  ```
77
77
  In Linux/MacOS you can do:
78
78
  ```
@@ -82,7 +82,7 @@ echo $VER
82
82
  Print the current version of Gam and address of this Wiki
83
83
  ```
84
84
  gam help
85
- GAM 7.19.01 - https://github.com/GAM-team/GAM
85
+ GAM 7.19.02 - https://github.com/GAM-team/GAM
86
86
  GAM Team <google-apps-manager@googlegroups.com>
87
87
  Python 3.13.7 64-bit final
88
88
  MacOS Sequoia 15.6.1 x86_64
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes