Compare commits

..

20 Commits

Author SHA1 Message Date
Ross Scroggs
84d04141b3 Issue #1722
Some checks failed
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-apis (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
2024-11-26 20:36:18 -08:00
Ross Scroggs
f29c697455 Updated code that uses the Domain Shared Contacts API with an HTTPS proxy to avoid a trap:
Some checks are pending
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Waiting to run
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run
2024-11-26 13:43:55 -08:00
Ross Scroggs
a1238c6397 Added option positivecountsonly to gam <UserTypeEntity> print|show filecomments 2024-11-26 13:09:44 -08:00
Ross Scroggs
4dfdc3a717 Fixes #1719
Some checks failed
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-apis (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
2024-11-23 15:32:33 -08:00
Jay Lee
7e97f68013 fix version parsing for Windows
Some checks failed
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-apis (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
2024-11-22 12:06:34 -05:00
Ross Scroggs
48ef2450fd Added support for managing/displaying Chrome profiles. 2024-11-22 08:32:11 -08:00
Jay Lee
ec769703d6 Fix scope defs for #1718
Some checks are pending
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Waiting to run
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run
2024-11-21 18:41:14 +00:00
Jay Lee
e2984ca10b basic print chromeprofiles output. #1718 2024-11-21 18:32:59 +00:00
Jay Lee
7400bfab70 Initial wiring for Chrome Profiles. Starts #1718
Some checks are pending
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Waiting to run
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run
2024-11-21 16:58:08 +00:00
Ross Scroggs
1870b25b0b Updated gam <UserTypeEntity> update serviceaccount
Some checks are pending
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Waiting to run
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run
to properly set the readonly scope
for `[R] 35)  Meet API (supports readonly)` as it is a special case.
2024-11-20 14:10:41 -08:00
Jay Lee
8f7eeae4a7 fix re
Some checks failed
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Has been cancelled
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-apis (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
2024-11-18 15:40:14 -05:00
Jay Lee
f2e16c52cb pyinstaller: include version info 2024-11-18 15:36:35 -05:00
Jay Lee
759f0cfb69 Create version_info.txt.in 2024-11-18 15:28:17 -05:00
Jay Lee
e1941cb220 pyinstaller: use Windows manifest 2024-11-18 15:23:12 -05:00
Jay Lee
1af1f10974 Create gam.exe.manifest for PyInstaller 2024-11-18 15:15:48 -05:00
Jay Lee
0e3d82b718 Update gam-install.sh 2024-11-18 12:53:00 -05:00
Jay Lee
74417bbe24 Throw proper error if MacOS is outdated. 2024-11-18 12:51:41 -05:00
Jay Lee
3ed60c95c2 Fix code scanning alert no. 13: Default version of SSL/TLS may be insecure
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2024-11-18 12:00:13 -05:00
Jay Lee
f859d5eb26 remove extra debug line
Some checks are pending
Build and test GAM / build (Win64, build, 9, VC-WIN64A, windows-2022) (push) Waiting to run
Build and test GAM / build (aarch64, build, 3, linux-aarch64, [self-hosted linux arm64]) (push) Waiting to run
Build and test GAM / build (aarch64, build, 5, linux-aarch64, [self-hosted linux arm64], yes) (push) Waiting to run
Build and test GAM / build (aarch64, build, 7, darwin64-arm64, macos-14) (push) Waiting to run
Build and test GAM / build (aarch64, build, 8, darwin64-arm64, macos-15) (push) Waiting to run
Build and test GAM / build (x86_64, build, 1, linux-x86_64, ubuntu-22.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 2, linux-x86_64, ubuntu-24.04) (push) Waiting to run
Build and test GAM / build (x86_64, build, 4, linux-x86_64, ubuntu-22.04, yes) (push) Waiting to run
Build and test GAM / build (x86_64, build, 6, darwin64-x86_64, macos-13) (push) Waiting to run
Build and test GAM / build (x86_64, test, 10, ubuntu-24.04, 3.9) (push) Waiting to run
Build and test GAM / build (x86_64, test, 11, ubuntu-24.04, 3.10) (push) Waiting to run
Build and test GAM / build (x86_64, test, 12, ubuntu-24.04, 3.11) (push) Waiting to run
Build and test GAM / build (x86_64, test, 13, ubuntu-24.04, 3.12) (push) Waiting to run
Build and test GAM / merge (push) Blocked by required conditions
Build and test GAM / publish (push) Blocked by required conditions
CodeQL / Analyze (python) (push) Waiting to run
Check for Google Root CA Updates / check-apis (push) Waiting to run
2024-11-18 07:36:42 -05:00
Jay Lee
f9848c78dc fix macos version extract 2024-11-18 07:34:49 -05:00
13 changed files with 588 additions and 174 deletions

View File

@@ -1059,6 +1059,7 @@ Specify a collection of items by directly specifying them; the item type is dete
all_shortcuts |
all_3p_shortcuts |
all_items |
my_commentable_items |
my_docs |
my_files |
my_folders |
@@ -1894,136 +1895,6 @@ gam calendar|calendars <CalendarEntity> print settings [todrive <ToDriveAttribut
[formatjson [quotechar <Character>]]
gam calendar|calendars <CalendarEntity> modify <CalendarSettings>+
# Chrome Browser Cloud Management
<QueryBrowser> ::= <String>
See: https://support.google.com/chrome/a/answer/9681204#retrieve_all_chrome_devices_for_an_account
<QueryBrowserList> ::= "<QueryBrowser>(,<QueryBrowser>)*"
<BrowserEntity> ::=
<DeviceIDList> |
(query:<QueryBrowser>)|(query:orgunitpath:<OrgUnitPath>)|(query <QueryBrowser>) |
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
<FileSelector> | <CSVFileSelector>
<BrowserAttribute> ::=
(annotatedassetid|asset|assetid <String>)|
(annotatedlocation|location <String>)|
(annotatednotes|notes <String>)|(updatenotes <String>)|
(annotateduser|user <String>
<BrowserFieldName> ::=
annotatedassetid|asset|assetid|
annotatedlocation|location|
annotatednotes|notes|
annotateduser|user|
browsers|
browserversions|
deviceid|
extensioncount|
installedbrowserversion|
lastactivitytime|
lastdeviceuser|
lastdeviceusers|
lastpolicyfetchtime|
lastregistrationtime|
laststatusreporttime|
machineextensionpolicies|
machinename|
machinepolicies|
orgunitpath|org|orgunit|
osarchitecture|
osplatform|
osplatformversion|
osversion|
ou|
policycount|
safebrowsingclickthroughcount|
serialnumber|
virtualdeviceid
<BrowserFieldNameList> ::= "<BrowseFieldName>(,<BrowserFieldName>)*"
<BrowserOrderByFieldName> ::=
annotatedassetid|assetassetid|
annotatedlocation|location|
annotatednotes|notes|
annotateduser|user|
browserversionchannel|
browserversionsortable|
deviceid|id|
enrollmentdate|
extensioncount|
lastactivity|
lastsignedinuser|
lastsync|
machinename|
orgunit|ou|org|
osversion|
osversionsortable|
platformmajorversion|
policycount
gam delete browser <DeviceID>
gam update browser <BrowserEntity> <BrowserAttibute>+
gam move browsers ou|org|orgunit <OrgUnitPath>
((ids <DeviceIDList>) |
(queries <QueryBrowserList> [querytime<String> <Time>]) |
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
<FileSelector> | <CSVFileSelector>)
[batchsize <Integer>]
gam info browser <DeviceID>
[basic|full|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[formatjson]
gam show browsers
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
[querytime<String> <Time>]
[orderby <BrowserOrderByFieldName> [ascending|descending]]
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[formatjson]
gam print browsers [todrive <ToDriveAttribute>*]
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
[querytime<String> <Time>]
[orderby <BrowserOrderByFieldName> [ascending|descending]]
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[sortheaders]
[formatjson [quotechar <Character>]]
gam create browsertoken
[ou|org|orgunit|browserou <OrgUnitPath>] [expire|expires <Time>]
[formatjson]
gam revoke browsertoken <BrowserTokenPermanentID>
<BrowserTokenFieldName> ::=
createtime|
creatorid|
customerid|
expiretime|
org|
orgunit|
orgunitpath|
ou|
revoketime|
revokerid|
state|
token|
tokenpermanentid
<BrowserTokenFieldNameList> ::= "<BrowserTokenFieldName>(,<BrowserTokenFieldName>)*"
gam show browsertokens
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowserToken>)|(queries <QueryBrowserTokenList>)))
[querytime<String> <Time>]
[orderby <BrowserTokenFieldName> [ascending|descending]]
[allfields] <BrowserTokenFieldName>* [fields <BrowserTokenFieldNameList>]
[formatjson]
gam print browsertokens [todrive <ToDriveAttribute>*]
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowserToken>)|(queries <QueryBrowserTokenList>)))
[querytime<String> <Time>]
[orderby <BrowserTokenFieldName> [ascending|descending]]
[allfields] <BrowserTokenFieldName>* [fields <BrowserTokenFieldNameList>]
[sortheaders]
[formatjson [quotechar <Character>]]
# Chat Bot
<ChatContent> ::=
@@ -2136,6 +2007,136 @@ gam info chatmessage name <ChatMessage>
gam info chatevent name <ChatEvent>
[formatjson]
# Chrome Browser Cloud Management
<QueryBrowser> ::= <String>
See: https://support.google.com/chrome/a/answer/9681204#retrieve_all_chrome_devices_for_an_account
<QueryBrowserList> ::= "<QueryBrowser>(,<QueryBrowser>)*"
<BrowserEntity> ::=
<DeviceIDList> |
(query:<QueryBrowser>)|(query:orgunitpath:<OrgUnitPath>)|(query <QueryBrowser>) |
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
<FileSelector> | <CSVFileSelector>
<BrowserAttribute> ::=
(annotatedassetid|asset|assetid <String>)|
(annotatedlocation|location <String>)|
(annotatednotes|notes <String>)|(updatenotes <String>)|
(annotateduser|user <String>
<BrowserFieldName> ::=
annotatedassetid|asset|assetid|
annotatedlocation|location|
annotatednotes|notes|
annotateduser|user|
browsers|
browserversions|
deviceid|
extensioncount|
installedbrowserversion|
lastactivitytime|
lastdeviceuser|
lastdeviceusers|
lastpolicyfetchtime|
lastregistrationtime|
laststatusreporttime|
machineextensionpolicies|
machinename|
machinepolicies|
orgunitpath|org|orgunit|
osarchitecture|
osplatform|
osplatformversion|
osversion|
ou|
policycount|
safebrowsingclickthroughcount|
serialnumber|
virtualdeviceid
<BrowserFieldNameList> ::= "<BrowserFieldName>(,<BrowserFieldName>)*"
<BrowserOrderByFieldName> ::=
annotatedassetid|assetassetid|
annotatedlocation|location|
annotatednotes|notes|
annotateduser|user|
browserversionchannel|
browserversionsortable|
deviceid|id|
enrollmentdate|
extensioncount|
lastactivity|
lastsignedinuser|
lastsync|
machinename|
orgunit|ou|org|
osversion|
osversionsortable|
platformmajorversion|
policycount
gam delete browser <DeviceID>
gam update browser <BrowserEntity> <BrowserAttibute>+
gam move browsers ou|org|orgunit <OrgUnitPath>
((ids <DeviceIDList>) |
(queries <QueryBrowserList> [querytime<String> <Time>]) |
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
<FileSelector> | <CSVFileSelector>)
[batchsize <Integer>]
gam info browser <DeviceID>
[basic|full|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[formatjson]
gam show browsers
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
[querytime<String> <Time>]
[orderby <BrowserOrderByFieldName> [ascending|descending]]
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[formatjson]
gam print browsers [todrive <ToDriveAttribute>*]
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
[querytime<String> <Time>]
[orderby <BrowserOrderByFieldName> [ascending|descending]]
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
[sortheaders]
[formatjson [quotechar <Character>]]
gam create browsertoken
[ou|org|orgunit|browserou <OrgUnitPath>] [expire|expires <Time>]
[formatjson]
gam revoke browsertoken <BrowserTokenPermanentID>
<BrowserTokenFieldName> ::=
createtime|
creatorid|
customerid|
expiretime|
org|
orgunit|
orgunitpath|
ou|
revoketime|
revokerid|
state|
token|
tokenpermanentid
<BrowserTokenFieldNameList> ::= "<BrowserTokenFieldName>(,<BrowserTokenFieldName>)*"
gam show browsertokens
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowserToken>)|(queries <QueryBrowserTokenList>)))
[querytime<String> <Time>]
[orderby <BrowserTokenFieldName> [ascending|descending]]
[allfields] <BrowserTokenFieldName>* [fields <BrowserTokenFieldNameList>]
[formatjson]
gam print browsertokens [todrive <ToDriveAttribute>*]
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowserToken>)|(queries <QueryBrowserTokenList>)))
[querytime<String> <Time>]
[orderby <BrowserTokenFieldName> [ascending|descending]]
[allfields] <BrowserTokenFieldName>* [fields <BrowserTokenFieldNameList>]
[sortheaders]
[formatjson [quotechar <Character>]]
# Chrome Installed Apps Counts
gam show chromeapps
@@ -2190,6 +2191,68 @@ gam show chromeneedsattn
(ous <OrgUnitList>)|(ous_and_children <OrgUnitList>)]
[formatjson]
# Chrome Profile Management
<ChromeProfileFieldName> ::=
affiliationstate|
annotatedlocation|
annotateduser|
attestationcredential|
browserchannel|
browserversion|
deviceinfo|
displayname|
extensioncount|
firstenrollmenttime|
identityprovider|
lastactivitytime|
lastpolicyfetchtime|
lastpolicysynctime|
laststatusreporttime|
name|
osplatformtype|
osplatformversion|
osversion|
policycount|
profileid|
profilepermanentid|
reportingdata|
useremail|
userid
<ChromeProfileFieldNameList> ::= "<ChromeProfileFieldName>(,<ChromeProfileFieldName>)*"
<ChromeProfileOrderByFieldName> ::=
affiliationstate|
browserchannel|
browserversion|
displayname|
extensioncount|
firstenrollmenttime|
identityprovider|
lastactivitytime|
lastpolicysynctime|
laststatusreporttime|
osplatformtype|
osversion|
policycount|
profileid|
useremail
gam delete chromeprofile <ChromeProfileName>
gam info chromeprofile <ChromeProfileName>
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
gam show chromeprofiles
[filtertime.* <Time>] [filter <String>]
[orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
[formatjson]
gam print chromeprofiles [todrive <ToDriveAttribute>*]
[filtertime.* <Time>] [filter <String>]
[orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
[[formatjson [quotechar <Character>]]
# Chrome Versions Counts
gam show chromeversions
@@ -6717,12 +6780,12 @@ gam print ownership <DriveFileID>|(drivefilename <DriveFileName>) [todrive <ToDr
gam <UserTypeEntity> show filecomments <DriveFileEntity>
[showdeleted] [start <Date>|<Time>]
[fields <CommentsFieldNameList>] [showphotolinks]
[countsonly]
[countsonly|positivecountsonly]
[formatjson]
gam <UserTypeEntity> print filecomments <DriveFileEntity> [todrive <ToDriveAttribute>*]
[showdeleted] [start <Date>|<Time>]
[fields <CommentsFieldNameList>] [showphotolinks]
[countsonly]
[countsonly|positivecountsonly]
(addcsvdata <FieldName> <String>)*
[formatjson [quotechar <Character>]]
@@ -7518,7 +7581,7 @@ gam <UserTypeEntity> show messages|threads
[labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>]
[countsonly|positivecountsonly] [useronly]
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
[showlabels] [delimiter <Character>] [showbody] [showdate] [showsize] [showsnippet]
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
[[attachmentnamepattern <RegularExpression>]
[showattachments [noshowtextplain]]
[saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
@@ -7529,7 +7592,7 @@ gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*]
[labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>]
[countsonly|positivecountsonly] [useronly]
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]]
[showlabels] [delimiter <Character>] [showbody] [showdate] [showsize] [showsnippet]
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
[convertcrnl] [delimiter <Character>]
[[attachmentnamepattern <RegularExpression>]
[showattachments [noshowtextplain]]]

View File

@@ -1,7 +1,51 @@
7.01.03
Fixed bug in `gam update cigroups <GroupEntity> delete|sync|update` where `cbcm-browser` and `chrome-os_device`
addresses were not properly handled.
7.01.02
Added option `positivecountsonly` to `gam <UserTypeEntity> print|show filecomments` that causes
GAM to display the number of comments and replies only for files that have comments.
Added `my_commentable_items` to `<DriveFileQueryShortcut>` that can be used with
`gam <UserTypeEntity> print|show filecomments my_commentable_items` to speed up processing.
Updated code that uses the Domain Shared Contacts API with an HTTPS proxy to avoid a trap:
```
Traceback (most recent call last):
...
File "atom/http.py", line 250, in _prepare_connection
AttributeError: module 'ssl' has no attribute 'wrap_socket'
```
7.01.01
Fixed bug in `gam <UserTypeEntity> print|show filetree` where no error message was generated
if a user had Drive disabled.
7.01.00
Fixed bug in `gam update chromepolicy` that caused some policy updates to fail.
Added option `showhtml` to `gam <UserTypeEntity> print|show messages` that, when used with `showbody`,
will display message body content of type HTML.
Added support for managing/displaying Chrome profiles.
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Profile-Management
7.00.40
Updated `gam <UserTypeEntity> update serviceaccount` to properly set the readonly scope
for `[R] 35) Meet API (supports readonly)` as it is a special case.
7.00.39
Supported MacOS versions are now in the download filename.
Minor code fixes.
7.00.38
Fixed logic flaw in `gam print|show policies` where non-matching policies were displayed.

View File

@@ -260,16 +260,18 @@ case $gamos in
# versions after 7.00.38 include MacOS version info
gam_macos_vers=$(echo -e "$gam_macos_urls" | \
grep --only-matching '\-macos[0-9\.]*' | \
cut -c 6-9)
cut -c 7-10)
for gam_mac_ver in $gam_macos_vers; do
echo -e "$gam_mac_ver\n"
if version_gt $currentversion $gam_mac_ver; then
usemac="$gam_mac_ver"
echo_green "Using GAM compiled against $usemac"
download_url=$(echo -e "$gam_macos_urls" | grep "$gam_mac_ver")
echo_green "You are running MacOS ${currentversion} Using GAM compiled against ${gam_mac_ver}"
break
fi
done
download_url=$(echo -e "$gam_macos_urls" | grep "$usemac")
if [ -z ${download_url+x} ]; then
echo_red "Sorry, you are running MacOS ${osversion} but GAM on ${gamarch} requires MacOS ${gam_mac_ver} or newer. Exiting."
exit
fi
else
# versions 7.00.38 and older don't include version info
case $gamarch in

11
src/gam.exe.manifest Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 8.1 / Server 2012 R2 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
<!-- Windows 10+ / Server 2016+ -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
</assembly>

View File

@@ -1,12 +1,30 @@
# -*- mode: python ; coding: utf-8 -*-
from os import getenv
from re import search
import re
from sys import platform
from PyInstaller.utils.hooks import copy_metadata
from gam.gamlib.glverlibs import GAM_VER_LIBS
with open("gam/__init__.py") as f:
version_file = f.read()
version = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M).group(1)
version_list = [int(i) for i in version.split('.')]
while len(version_list) < 4:
version_list.append(0)
version_tuple = tuple(version_list)
version_str = str(version_tuple)
with open("version_info.txt.in") as f:
version_info = f.read()
version_info = version_info.replace("{VERSION}", version).replace(
"{VERSION_TUPLE}", version_str
)
with open("version_info.txt", "w") as f:
f.write(version_info)
print(version_info)
datas = []
for pkg in GAM_VER_LIBS:
datas += copy_metadata(pkg, recursive=True)
@@ -50,6 +68,8 @@ pyz = PYZ(a.pure,
target_arch = None
codesign_identity = None
entitlements_file = None
manifest = None
version = 'version_info.txt'
match platform:
case "darwin":
if getenv('arch') == 'universal2':
@@ -62,6 +82,7 @@ match platform:
case "win32":
target_arch = None
strip = False
manifest = 'gam.exe.manifest'
case _:
target_arch = None
strip = True
@@ -83,6 +104,7 @@ if getenv('PYINSTALLER_BUILD_ONEDIR') == 'yes':
debug=debug,
bootloader_ignore_signals=bootloader_ignore_signals,
strip=strip,
manifest=manifest,
upx=upx,
console=console,
# put most everyting under a lib/ subfolder
@@ -92,6 +114,7 @@ if getenv('PYINSTALLER_BUILD_ONEDIR') == 'yes':
target_arch=target_arch,
codesign_identity=codesign_identity,
entitlements_file=entitlements_file,
version=version,
)
coll = COLLECT(
exe,
@@ -115,6 +138,7 @@ else:
name=name,
debug=debug,
bootloader_ignore_signals=bootloader_ignore_signals,
manifest=manifest,
strip=strip,
upx=upx,
console=console,
@@ -123,5 +147,6 @@ else:
target_arch=target_arch,
codesign_identity=codesign_identity,
entitlements_file=entitlements_file,
version=version,
)

View File

@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
"""
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
__version__ = '7.00.39'
__version__ = '7.01.03'
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
#pylint: disable=wrong-import-position
@@ -5729,8 +5729,10 @@ def convertUIDtoEmailAddressWithType(emailAddressOrUID, cd=None, sal=None, email
# Convert UID to email address
def convertUIDtoEmailAddress(emailAddressOrUID, cd=None, emailTypes=None,
checkForCustomerId=False, ciGroupsAPI=False, aliasAllowed=True):
if emailAddressOrUID.startswith('cbcm-browser.'):
return emailAddressOrUID
if ciGroupsAPI:
normalizedEmailAddressOrUID = normalizeEmailAddressOrUID(emailAddressOrUID, ciGroupsAPI=ciGroupsAPI)
if normalizedEmailAddressOrUID.startswith('cbcm-browser.') or normalizedEmailAddressOrUID.startswith('chrome-os-device.'):
return normalizedEmailAddressOrUID
email, _ = convertUIDtoEmailAddressWithType(emailAddressOrUID, cd, emailTypes,
checkForCustomerId, ciGroupsAPI, aliasAllowed)
return email
@@ -10550,7 +10552,7 @@ Continue to authorization by entering a 'c'
selectedScopes[i] = '*'
break
if 'readonly' in a_scope['subscopes']:
if scope == possibleScope+'.readonly':
if (scope == possibleScope+'.readonly') or (scope == a_scope.get('roscope')):
selectedScopes[i] = 'R'
break
i += 1
@@ -12140,8 +12142,12 @@ def checkServiceAccount(users):
checkScopesSet.add(scope['scope'])
elif selectedScopes[i] == 'R':
saScopes.setdefault(scope['api'], [])
saScopes[scope['api']].append(f'{scope["scope"]}.readonly')
checkScopesSet.add(f'{scope["scope"]}.readonly')
if 'roscope' not in scope:
saScopes[scope['api']].append(f'{scope["scope"]}.readonly')
checkScopesSet.add(f'{scope["scope"]}.readonly')
else:
saScopes[scope['api']].append(scope['roscope'])
checkScopesSet.add(scope['roscope'])
i += 1
if API.DRIVEACTIVITY in saScopes and API.DRIVE3 in saScopes:
saScopes[API.DRIVEACTIVITY].append(API.DRIVE_SCOPE)
@@ -25118,6 +25124,192 @@ def doUpdateBrowsers():
except (GAPI.badRequest, GAPI.resourceNotFound, GAPI.forbidden):
checkEntityAFDNEorAccessErrorExit(None, Ent.CHROME_BROWSER, deviceId, i, count)
def _getChromeProfileName():
profileName = getString(Cmd.OB_CHROMEPROFILE_ID)
if not profileName.startswith('customers'):
customerId = _getCustomerId()
profileName = f'customers/{customerId}/profiles/{profileName}'
return profileName
# gam delete chromeprofile <ChromeProfileName>
def doDeleteChromeProfile():
cm = buildGAPIObject(API.CHROMEMANAGEMENT)
profileName = _getChromeProfileName()
checkForExtraneousArguments()
try:
callGAPI(cm.customers().profiles(), 'delete',
throwReasons=[GAPI.INVALID_ARGUMENT, GAPI.NOT_FOUND, GAPI.PERMISSION_DENIED],
name=profileName)
entityActionPerformed([Ent.CHROME_PROFILE, profileName])
except (GAPI.invalidArgument, GAPI.notFound, GAPI.permissionDenied) as e:
entityActionFailedExit([Ent.CHROME_PROFILE, profileName], str(e))
CHROMEPROFILE_TIME_OBJECTS = {
'firstEnrollmentTime',
'lastActivityTime',
'lastPolicyFetchTime',
'lastPolicySyncTime',
'lastStatusReportTime',
}
def _showChromeProfile(profile, FJQC, i=0, count=0):
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(profile, timeObjects=CHROMEPROFILE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True))
return
printEntity([Ent.CHROME_PROFILE, profile['name']], i, count)
Ind.Increment()
showJSON(None, profile, timeObjects=CHROMEPROFILE_TIME_OBJECTS)
Ind.Decrement()
CHROMEPROFILE_FIELDS_CHOICE_MAP = {
'affiliationstate': 'affiliationState',
'annotatedlocation': 'annotatedLocation',
'annotateduser': 'annotatedUser',
'attestationcredential': 'attestationCredential',
'browserchannel': 'browserChannel',
'browserversion': 'browserVersion',
'deviceinfo': 'deviceInfo',
'displayname': 'displayName',
'extensioncount': 'extensionCount',
'firstenrollmenttime': 'firstEnrollmentTime',
'identityprovider':'identityProvider',
'lastactivitytime': 'lastActivityTime',
'lastpolicyfetchtime': 'lastPolicyFetchTime',
'lastpolicysynctime': 'lastPolicySyncTime',
'laststatusreporttime': 'lastStatusReportTime',
'name': 'name',
'osplatformtype': 'osPlatformType',
'osplatformversion':'osPlatformVersion',
'osversion': 'osVersion',
'policycount': 'policyCount',
'profileid': 'profileId',
'profilepermanentid': 'profilePermanentId',
'reportingdata': 'reportingData',
'useremail': 'userEmail',
'userid': 'userId',
}
# gam info chromeprofile <ChromeProfileName>
# <ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
# [formatjson]
def doInfoChromeProfile():
cm = buildGAPIObject(API.CHROMEMANAGEMENT)
profileName = _getChromeProfileName()
fieldsList = []
FJQC = FormatJSONQuoteChar()
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if getFieldsList(myarg, CHROMEPROFILE_FIELDS_CHOICE_MAP, fieldsList, initialField='name'):
pass
else:
FJQC.GetFormatJSON(myarg)
fields = ','.join(set(fieldsList))
try:
profile = callGAPI(cm.customers().profiles(), 'get',
throwReasons=[GAPI.INVALID_ARGUMENT, GAPI.NOT_FOUND, GAPI.PERMISSION_DENIED],
name=profileName, fields=fields)
_showChromeProfile(profile, FJQC)
except (GAPI.invalidArgument, GAPI.notFound, GAPI.permissionDenied) as e:
entityActionFailedExit([Ent.CHROME_PROFILE, profileName], str(e))
CHROMEPROFILE_ORDERBY_CHOICE_MAP = {
'affiliationstate': 'affiliationState',
'browserchannel': 'browserChannel',
'browserversion': 'browserVersion',
'displayname': 'displayName',
'extensioncount': 'extensionCount',
'firstenrollmenttime': 'firstEnrollmentTime',
'identityprovider': 'identityProvider',
'lastactivitytime': 'lastActivityTime',
'lastpolicysynctime': 'lastPolicySyncTime',
'laststatusreporttime': 'lastStatusReportTime',
'osplatformtype': 'osPlatformType',
'osversion': 'osVersion',
'policycount': 'policyCount',
'profileid': 'profileId',
'useremail': 'userEmail',
}
# gam show chromeprofiles
# [filtertime.* <Time>] [filter <String>]
# [orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
# <ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
# [formatjson]
# gam print chromeprofiles [todrive <ToDriveAttribute>*]
# [filtertime.* <Time>] [filter <String>]
# [orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
# <ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
# [[formatjson [quotechar <Character>]]
def doPrintShowChromeProfiles():
def _printProfile(profile):
row = flattenJSON(profile, timeObjects=CHROMEPROFILE_TIME_OBJECTS)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
csvPF.WriteRowNoFilter({'name': profile['name'], 'profileId': profile['profileId'],
'JSON': json.dumps(cleanJSON(profile, timeObjects=CHROMEPROFILE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True)})
cm = buildGAPIObject(API.CHROMEMANAGEMENT)
csvPF = CSVPrintFile(['name', 'profileId']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
OBY = OrderBy(CHROMEPROFILE_ORDERBY_CHOICE_MAP)
sortHeaders = False
fieldsList = []
cbfilter = None
filterTimes = {}
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if csvPF and myarg == 'todrive':
csvPF.GetTodriveParameters()
elif getFieldsList(myarg, CHROMEPROFILE_FIELDS_CHOICE_MAP, fieldsList, initialField=['name', 'profileId']):
pass
elif myarg == 'orderby':
OBY.GetChoice()
elif myarg.startswith('filtertime'):
filterTimes[myarg] = getTimeOrDeltaFromNow()
elif myarg in {'filter', 'filters'}:
cbfilter = getString(Cmd.OB_STRING)
elif myarg == 'sortheaders':
sortHeaders = True
else:
FJQC.GetFormatJSONQuoteChar(myarg, True)
if filterTimes and filter is not None:
for filterTimeName, filterTimeValue in iter(filterTimes.items()):
cbfilter = cbfilter.replace(f'#{filterTimeName}#', filterTimeValue)
fields = getItemFieldsFromFieldsList('chromeBrowserProfiles', fieldsList)
customerId = _getCustomerId()
parent = f'customers/{customerId}'
printGettingAllAccountEntities(Ent.CHROME_PROFILE, cbfilter)
pageMessage = getPageMessage()
try:
feed = yieldGAPIpages(cm.customers().profiles(), 'list', 'chromeBrowserProfiles',
pageMessage=pageMessage,
throwReasons=[GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
parent=parent, pageSize=200,
filter=cbfilter, orderBy=OBY.orderBy, fields=fields)
for profiles in feed:
if not csvPF:
jcount = len(profiles)
if not FJQC.formatJSON:
performActionNumItems(jcount, Ent.CHROME_PROFILE)
Ind.Increment()
j = 0
for profile in profiles:
j += 1
_showChromeProfile(profile, FJQC, j, jcount)
Ind.Decrement()
else:
for profile in profiles:
_printProfile(profile)
except (GAPI.invalidArgument, GAPI.permissionDenied) as e:
entityActionFailedExit([Ent.CHROME_PROFILE, cbfilter], str(e))
if csvPF:
if sortHeaders:
csvPF.SetSortTitles(['name', 'profileId'])
csvPF.writeCSVfile('Chrome Profiles')
BROWSER_ORDERBY_CHOICE_MAP = {
'annotatedassetid': 'annotated_asset_id', 'asset': 'annotated_asset_id', 'assetid': 'annotated_asset_id',
'annotatedlocation': 'annotated_location', 'location': 'annotated_location',
@@ -27765,7 +27957,9 @@ def doUpdateChromePolicy():
elif vtype == 'TYPE_BOOL':
pass
elif vtype == 'TYPE_ENUM':
value = f"{schema['settings'][lowerField]['enum_prefix']}{value}"
prefix = schema['settings'][lowerField]['enum_prefix']
if not value.startswith(prefix):
value = "{prefix}{value}"
elif vtype == 'TYPE_LIST':
value = value.split(',') if value else []
if myarg == 'chrome.users.chromebrowserupdates' and casedField == 'targetVersionPrefixSetting':
@@ -34447,7 +34641,7 @@ def doUpdateCIGroups():
continue
_batchAddGroupMembers(parent, i, count,
[convertUIDtoEmailAddress(member, cd=cd, emailTypes='any',
checkForCustomerId=True) for member in addMembers],
checkForCustomerId=True, ciGroupsAPI=True) for member in addMembers],
role, expireTime)
elif CL_subCommand in {'delete', 'remove'}:
baseRole, groupMemberType = _getRoleGroupMemberType()
@@ -34489,11 +34683,12 @@ def doUpdateCIGroups():
j = 0
for member in removeMembers:
j += 1
memberEmail = convertUIDtoEmailAddress(member, cd=cd, emailTypes='any', checkForCustomerId=True)
memberEmail = convertUIDtoEmailAddress(member, cd=cd, emailTypes='any',
checkForCustomerId=True, ciGroupsAPI=True)
try:
memberName = callGAPI(ci.groups().memberships(), 'lookup',
throwReasons=GAPI.CIGROUP_GET_THROW_REASONS,
parent=parent, memberKey_id=member, fields='name').get('name')
parent=parent, memberKey_id=memberEmail, fields='name').get('name')
callGAPI(ci.groups().memberships(), 'delete',
throwReasons=GAPI.MEMBERS_THROW_REASONS+[GAPI.FAILED_PRECONDITION],
name=memberName)
@@ -34522,7 +34717,7 @@ def doUpdateCIGroups():
syncMembersMaps[baseRole] = {}
for member in syncMembers:
syncMembersSets[baseRole].add(_cleanConsumerAddress(convertUIDtoEmailAddress(member, cd=cd, emailTypes='any',
checkForCustomerId=True), syncMembersMaps[baseRole]))
checkForCustomerId=True, ciGroupsAPI=True), syncMembersMaps[baseRole]))
checkForExtraneousArguments()
i = 0
count = len(entityList)
@@ -34644,7 +34839,8 @@ def doUpdateCIGroups():
j = 0
for member in updateMembers:
j += 1
memberEmail = convertUIDtoEmailAddress(member, cd=cd, emailTypes='any', checkForCustomerId=True)
memberEmail = convertUIDtoEmailAddress(member, cd=cd, emailTypes='any',
checkForCustomerId=True, ciGroupsAPI=True)
try:
memberName = callGAPI(ci.groups().memberships(), 'lookup',
throwReasons=GAPI.CIGROUP_GET_THROW_REASONS,
@@ -51754,6 +51950,7 @@ QUERY_SHORTCUTS_MAP = {
'allshortcuts': f"mimeType = '{MIMETYPE_GA_SHORTCUT}'",
'all3pshortcuts': f"mimeType = '{MIMETYPE_GA_3P_SHORTCUT}'",
'allitems': 'allitems',
'mycommentableitems': ME_IN_OWNERS_AND+f"(mimeType = '{MIMETYPE_GA_DOCUMENT}' or mimeType = '{MIMETYPE_GA_SPREADSHEET}' or mimeType = '{MIMETYPE_GA_PRESENTATION}')",
'mydocs': ME_IN_OWNERS_AND+f"mimeType = '{MIMETYPE_GA_DOCUMENT}'",
'myfiles': ME_IN_OWNERS_AND+f"mimeType != '{MIMETYPE_GA_FOLDER}'",
'myfolders': ME_IN_OWNERS_AND+f"mimeType = '{MIMETYPE_GA_FOLDER}'",
@@ -54623,7 +54820,8 @@ def initFileTree(drive, shareddrive, DLP, shareddriveFields, showParent, user, i
except (GAPI.notFound, GAPI.fileNotFound, GAPI.invalid, GAPI.noListTeamDrivesAdministratorPrivilege) as e:
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE, fileId], str(e), i, count)
return (None, False)
except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy):
except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
userSvcNotApplicableOrDriveDisabled(user, str(e), i, count)
return (None, False)
return (fileTree, True)
@@ -56040,14 +56238,14 @@ def _showComment(comment, stripPhotoLinks, timeObjects, i=0, count=0, FJQC=None)
Ind.Decrement()
# gam <UserTypeEntity> show filecomments <DriveFileEntity>
# [showdeleted] [start <Date>|<Time>] [countsonly]
# [showdeleted] [start <Date>|<Time>] [countsonly|positivecountsonly]
# [fields <CommentsFieldNameList>] [showphotolinks]
# [countsonly]
# [formatjson]
# gam <UserTypeEntity> print filecomments <DriveFileEntity> [todrive <ToDriveAttribute>*]
# [showdeleted] [start <Date>|<Time>]
# [fields <CommentsFieldNameList>] [showphotolinks]
# [countsonly]
# [countsonly|positivecountsonly]
# (addcsvdata <FieldName> <String>)*
# [formatjson [quotechar <Character>]]
def printShowFileComments(users):
@@ -56072,7 +56270,7 @@ def printShowFileComments(users):
FJQC = FormatJSONQuoteChar(csvPF)
fieldsList = []
fileIdEntity = getDriveFileEntity()
countsOnly = False
countsOnly = positiveCountsOnly = False
stripPhotoLinks = True
kwargs = {}
addCSVData = {}
@@ -56093,6 +56291,8 @@ def printShowFileComments(users):
addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
elif myarg == 'countsonly':
countsOnly = True
elif myarg == 'positivecountsonly':
countsOnly = positiveCountsOnly = True
else:
FJQC.GetFormatJSONQuoteChar(myarg)
if csvPF:
@@ -56146,7 +56346,8 @@ def printShowFileComments(users):
numReplies += len(comment['replies'])
if not csvPF:
if countsOnly:
printKeyValueList([Ent.Singular(Ent.DRIVE_FILE_ID), fileId, 'comments', kcount, 'replies', numReplies])
if not positiveCountsOnly or kcount > 0:
printKeyValueList([Ent.Singular(Ent.DRIVE_FILE_ID), fileId, 'comments', kcount, 'replies', numReplies])
else:
if not FJQC.formatJSON:
entityPerformActionNumItems([Ent.DRIVE_FILE_ID, fileId], kcount, Ent.DRIVE_FILE_COMMENT, j, jcount)
@@ -56158,12 +56359,13 @@ def printShowFileComments(users):
_showComment(comment, stripPhotoLinks, timeObjects, k, kcount, FJQC)
Ind.Decrement()
elif countsOnly:
row = {'User': user, 'fileId': fileId}
if addCSVData:
row.update(addCSVData)
row['comments'] = kcount
row['replies'] = numReplies
csvPF.WriteRowTitles(row)
if not positiveCountsOnly or kcount > 0:
row = {'User': user, 'fileId': fileId}
if addCSVData:
row.update(addCSVData)
row['comments'] = kcount
row['replies'] = numReplies
csvPF.WriteRowTitles(row)
elif comments:
baserow = {'User': user, 'fileId': fileId}
if addCSVData:
@@ -70015,6 +70217,9 @@ def printShowMessagesThreads(users, entityType):
if part['mimeType'] == 'text/plain':
if 'data' in part['body']:
data += base64.urlsafe_b64decode(str(part['body']['data'])).decode(UTF8)+'\n'
elif show_html and part['mimeType'] == 'text/html':
if 'data' in part['body']:
data += base64.urlsafe_b64decode(str(part['body']['data'])).decode(UTF8)+'\n'
elif part['mimeType'] == 'text/rfc822-headers':
if 'data' in part['body']:
data += _decodeHeader(base64.urlsafe_b64decode(str(part['body']['data'])).decode(UTF8)+'\n')
@@ -70469,7 +70674,7 @@ def printShowMessagesThreads(users, entityType):
convertCRNL = GC.Values[GC.CSV_OUTPUT_CONVERT_CR_NL]
delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
countsOnly = positiveCountsOnly = includeSpamTrash = onlyUser = overwrite = save_attachments = upload_attachments = False
show_all_headers = show_attachments = show_body = show_date = show_labels = show_size = show_snippet = False
show_all_headers = show_attachments = show_body = show_date = show_html = show_labels = show_size = show_snippet = False
noshow_text_plain = False
attachmentNamePattern = None
targetFolderPattern = GC.Values[GC.DRIVE_DIR]
@@ -70499,6 +70704,8 @@ def printShowMessagesThreads(users, entityType):
show_date = True
elif myarg == 'showbody':
show_body = True
elif myarg == 'showhtml':
show_html = True
elif myarg == 'showlabels':
show_labels = True
elif myarg == 'showsize':
@@ -70769,7 +70976,7 @@ def printShowMessagesThreads(users, entityType):
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
# [labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showdate] [showsize] [showsnippet]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [convertcrnl] [delimiter <Character>]
# [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>]
@@ -70779,7 +70986,7 @@ def printShowMessagesThreads(users, entityType):
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
# [labelmatchpattern <RegularExpression>] [sendermatchpattern <RegularExpression>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showdate] [showsize] [showsnippet]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>]
# [showattachments [noshowtextplain]]
@@ -70792,7 +70999,7 @@ def printShowMessages(users):
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
# [labelmatchpattern <RegularExpression>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showdate] [showsize] [showsnippet]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [convertcrnl] [delimiter <Character>]
# [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>]
@@ -70802,7 +71009,7 @@ def printShowMessages(users):
# (((query <QueryGmail> [querytime<String> <Date>]*) (matchlabel <LabelName>) [or|and])* [quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <ThreadIDEntity>)
# [labelmatchpattern <RegularExpression>]
# [headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
# [showlabels] [showbody] [showdate] [showsize] [showsnippet]
# [showlabels] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
# [countsonly|positivecountsonly] [useronly]
# [[attachmentnamepattern <RegularExpression>]
# [showattachments [noshowtextplain]]
@@ -75058,6 +75265,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
Cmd.ARG_CHATMESSAGE: doDeleteChatMessage,
Cmd.ARG_CHROMENETWORK: doDeleteChromeNetwork,
Cmd.ARG_CHROMEPOLICY: doDeleteChromePolicy,
Cmd.ARG_CHROMEPROFILE: doDeleteChromeProfile,
Cmd.ARG_CIGROUP: doDeleteCIGroups,
Cmd.ARG_CLASSROOMINVITATION: doDeleteClassroomInvitations,
Cmd.ARG_CONTACT: doDeleteDomainContacts,
@@ -75138,6 +75346,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
Cmd.ARG_CHATMESSAGE: doInfoChatMessage,
Cmd.ARG_CHATSPACE: doInfoChatSpace,
Cmd.ARG_CHROMEAPP: doInfoChromeApp,
Cmd.ARG_CHROMEPROFILE: doInfoChromeProfile,
Cmd.ARG_CHROMESCHEMA: doInfoChromePolicySchemas,
Cmd.ARG_CIGROUP: doInfoCIGroups,
Cmd.ARG_CIGROUPMEMBERS: doInfoCIGroupMembers,
@@ -75224,6 +75433,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
Cmd.ARG_CHROMEHISTORY: doPrintShowChromeHistory,
Cmd.ARG_CHROMENEEDSATTN: doPrintShowChromeNeedsAttn,
Cmd.ARG_CHROMEPOLICY: doPrintShowChromePolicies,
Cmd.ARG_CHROMEPROFILE: doPrintShowChromeProfiles,
Cmd.ARG_CHROMESCHEMA: doPrintShowChromeSchemas,
Cmd.ARG_CHROMESNVALIDITY: doPrintChromeSnValidity,
Cmd.ARG_CHROMEVERSIONS: doPrintShowChromeVersions,
@@ -75355,6 +75565,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
Cmd.ARG_CHROMEHISTORY: doPrintShowChromeHistory,
Cmd.ARG_CHROMENEEDSATTN: doPrintShowChromeNeedsAttn,
Cmd.ARG_CHROMEPOLICY: doPrintShowChromePolicies,
Cmd.ARG_CHROMEPROFILE: doPrintShowChromeProfiles,
Cmd.ARG_CHROMESCHEMA: doPrintShowChromeSchemas,
Cmd.ARG_CHROMEVERSIONS: doPrintShowChromeVersions,
Cmd.ARG_CIGROUPMEMBERS: doShowCIGroupMembers,
@@ -75537,6 +75748,7 @@ MAIN_COMMANDS_OBJ_ALIASES = {
Cmd.ARG_CHROMEAPPS: Cmd.ARG_CHROMEAPP,
Cmd.ARG_CHROMENETWORKS: Cmd.ARG_CHROMENETWORK,
Cmd.ARG_CHROMEPOLICIES: Cmd.ARG_CHROMEPOLICY,
Cmd.ARG_CHROMEPROFILES: Cmd.ARG_CHROMEPROFILE,
Cmd.ARG_CHROMESCHEMAS: Cmd.ARG_CHROMESCHEMA,
Cmd.ARG_CIGROUPS: Cmd.ARG_CIGROUP,
Cmd.ARG_CIGROUPSMEMBERS: Cmd.ARG_CIGROUPMEMBERS,

View File

@@ -247,7 +247,9 @@ class ProxiedHttpClient(HttpClient):
# Trivial setup for ssl socket.
sslobj = None
if ssl_imported:
sslobj = ssl.wrap_socket(p_sock, None, None)
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.minimum_version = ssl.TLSVersion.TLSv1_2
sslobj = context.wrap_socket(p_sock, server_hostname=url.host)
else:
sock_ssl = socket.ssl(p_sock, None, None)
sslobj = http.client.FakeSocket(p_sock, sock_ssl)

View File

@@ -564,9 +564,11 @@ class ProxiedHttpClient(HttpClient):
# Trivial setup for ssl socket.
sslobj = None
if ssl is not None:
sslobj = ssl.wrap_socket(p_sock, None, None)
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.minimum_version = ssl.TLSVersion.TLSv1_2
sslobj = context.wrap_socket(p_sock, server_hostname=uri.host)
else:
sock_ssl = socket.ssl(p_sock, None, Nonesock_)
sock_ssl = socket.ssl(p_sock, None, None)
sslobj = http.client.FakeSocket(p_sock, sock_ssl)
# Initalize httplib and replace with the proxy socket.
connection = http.client.HTTPConnection(proxy_uri.host)

View File

@@ -38,8 +38,8 @@ class GamAction():
CLAIM_OWNERSHIP = 'clow'
CLEAR = 'clea'
CLOSE = 'clos'
COLLECT = 'collect'
COMMENT = 'comment'
COLLECT = 'coll'
COMMENT = 'comm'
COPY = 'copy'
COPY_MERGE = 'copm'
CREATE = 'crea'

View File

@@ -37,6 +37,7 @@ CHAT_SPACES_DELETE = 'chatspacesdelete'
CHAT_SPACES_DELETE_ADMIN = 'chatspacesdeleteadmin'
CHROMEMANAGEMENT = 'chromemanagement'
CHROMEMANAGEMENT_APPDETAILS = 'chromemanagementappdetails'
CHROMEMANAGEMENT_CHROMEPROFILES = 'chromemanagementchromeprofiles'
CHROMEMANAGEMENT_TELEMETRY = 'chromemanagementtelemetry'
CHROMEPOLICY = 'chromepolicy'
CHROMEVERSIONHISTORY = 'versionhistory'
@@ -297,6 +298,10 @@ _CLIENT_SCOPES = [
'api': CHROMEMANAGEMENT_APPDETAILS,
'subscopes': [],
'scope': 'https://www.googleapis.com/auth/chrome.management.appdetails.readonly'},
{'name': 'Chrome Management API - Profiles',
'api': CHROMEMANAGEMENT_CHROMEPROFILES,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/chrome.management.profiles'},
{'name': 'Chrome Management API - Telemetry read only',
'api': CHROMEMANAGEMENT_TELEMETRY,
'subscopes': [],
@@ -666,7 +671,8 @@ _SVCACCT_SCOPES = [
{'name': 'Meet API',
'api': MEET,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/meetings.space.created'},
'scope': 'https://www.googleapis.com/auth/meetings.space.created',
'roscope': 'https://www.googleapis.com/auth/meetings.space.readonly'},
{'name': 'OAuth2 API',
'api': OAUTH2,
'subscopes': [],

View File

@@ -483,6 +483,8 @@ class GamCLArgs():
ARG_CHROMEPOLICYIMAGE = 'chromepolicyimage'
ARG_CHROMEPOLICY = 'chromepolicy'
ARG_CHROMEPOLICIES = 'chromepolicies'
ARG_CHROMEPROFILE = 'chromeprofile'
ARG_CHROMEPROFILES = 'chromeprofiles'
ARG_CHROMESCHEMA = 'chromeschema'
ARG_CHROMESCHEMAS = 'chromeschemas'
ARG_CHROMESNVALIDITY = 'chromesnvalidity'
@@ -846,6 +848,7 @@ class GamCLArgs():
OB_CHAT_MESSAGE_ID = 'ChatMessageID'
OB_CHAT_SPACE = 'ChatSpace'
OB_CHAT_THREAD = 'ChatThread'
OB_CHROMEPROFILE_ID = 'ChromeProfileId'
OB_CHROME_VERSION = 'ChromeVersion'
OB_CIDR_NETMASK = 'CIDRnetmask'
OB_CIGROUP_ALIAS_LIST = "CIGroupAliasList"

View File

@@ -108,6 +108,7 @@ class GamEntity():
CHROME_POLICY = 'cpol'
CHROME_POLICY_IMAGE = 'cpim'
CHROME_POLICY_SCHEMA = 'cpsc'
CHROME_PROFILE = 'cpro'
CHROME_RELEASE = 'crel'
CHROME_VERSION = 'cver'
CLASSIFICATION_LABEL = 'dlab'
@@ -460,6 +461,7 @@ class GamEntity():
CHROME_POLICY: ['Chrome Policies', 'Chrome Policy'],
CHROME_POLICY_IMAGE: ['Chrome Policy Images', 'Chrome Policy Image'],
CHROME_POLICY_SCHEMA: ['Chrome Policy Schemas', 'Chrome Policy Schema'],
CHROME_PROFILE: ['Chrome Profiles', 'Chrome Profile'],
CHROME_RELEASE: ['Chrome Releases', 'Chrome Release'],
CHROME_VERSION: ['Chrome Versions', 'Chrome Version'],
CLASSIFICATION_LABEL: ['Classification Labels', 'Classification Label'],

42
src/version_info.txt.in Normal file
View File

@@ -0,0 +1,42 @@
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers={VERSION_TUPLE},
prodvers={VERSION_TUPLE},
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x4,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x2,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
'040904b0',
[StringStruct('CompanyName', 'GAM-team'),
StringStruct('FileDescription', 'CLI for Google Workspace admins'),
StringStruct('FileVersion', '{VERSION}'),
StringStruct('LegalCopyright', 'Copyright (c) 2024 GAM team'),
StringStruct('OriginalFilename', 'gam.exe'),
StringStruct('ProductName', 'GAM'),
StringStruct('ProductVersion', '{VERSION}')])
]),
VarFileInfo([VarStruct('Translation', [1033, 1200])])
]
)