mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-10 17:21:36 +00:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84d04141b3 | ||
|
|
f29c697455 | ||
|
|
a1238c6397 | ||
|
|
4dfdc3a717 | ||
|
|
7e97f68013 | ||
|
|
48ef2450fd | ||
|
|
ec769703d6 | ||
|
|
e2984ca10b | ||
|
|
7400bfab70 | ||
|
|
1870b25b0b | ||
|
|
8f7eeae4a7 | ||
|
|
f2e16c52cb | ||
|
|
759f0cfb69 | ||
|
|
e1941cb220 | ||
|
|
1af1f10974 | ||
|
|
0e3d82b718 | ||
|
|
74417bbe24 | ||
|
|
3ed60c95c2 | ||
|
|
f859d5eb26 | ||
|
|
f9848c78dc |
@@ -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]]]
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
11
src/gam.exe.manifest
Normal 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>
|
||||
27
src/gam.spec
27
src/gam.spec
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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': [],
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
42
src/version_info.txt.in
Normal 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])])
|
||||
]
|
||||
)
|
||||
Reference in New Issue
Block a user