Compare commits

...

14 Commits

Author SHA1 Message Date
dependabot[bot]
5b23efd83f Bump cryptography in the pip group across 1 directory
Bumps the pip group with 1 update in the / directory: [cryptography](https://github.com/pyca/cryptography).


Updates `cryptography` from 46.0.3 to 46.0.5
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/46.0.3...46.0.5)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 46.0.5
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 02:54:50 +00:00
Ross Scroggs
b7c96a8172 Fixed bug in gam [<UserTypeEntity>] sendemail
Some checks failed
Push wiki / pushwiki (push) Has been cancelled
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
2026-02-10 14:01:06 -08:00
Ross Scroggs
fed1662eb4 Fixed bug in gam [<UserTypeEntity>] sendemail 2026-02-10 12:58:16 -08:00
Ross Scroggs
077747be99 Update No-Owner-Secondary-Calendars.md 2026-02-09 08:41:21 -08:00
Ross Scroggs
9eee475b4a Update No-Owner-Secondary-Calendars.md
Some checks failed
Check for Google Root CA Updates / check-certs (push) Has been cancelled
Push wiki / pushwiki (push) Has been cancelled
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
2026-02-09 08:28:09 -08:00
Ross Scroggs
2636dd9827 Added hideinvitationssetting to <UserCalendarSettingsField>
Some checks failed
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Push wiki / pushwiki (push) Has been cancelled
2026-02-07 06:55:26 -08:00
Ross Scroggs
e18a70e55b Added hideinvitationssetting to <UserCalendarSettingsField> 2026-02-07 06:55:07 -08:00
Ross Scroggs
e11123fccd Update Users-Gmail-Delegates.md 2026-02-07 06:51:43 -08:00
Ross Scroggs
536ea84321 Update No-Owner-Secondary-Calendars.md
Some checks failed
Push wiki / pushwiki (push) Has been cancelled
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
2026-02-06 12:45:36 -08:00
Ross Scroggs
4d953ac09b Update No-Owner-Secondary-Calendars.md 2026-02-06 12:43:54 -08:00
Ross Scroggs
d9ce0acd83 Secondary Calendars with no Owner 2026-02-06 12:42:07 -08:00
Ross Scroggs
f735e5e268 Added option shownopolicy to gam print chromepolicies
Some checks failed
Push wiki / pushwiki (push) Has been cancelled
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
2026-02-05 12:14:11 -08:00
Ross Scroggs
97358d15ef Added option shownopolicy to `gam print chromepolicies 2026-02-05 11:27:19 -08:00
Ross Scroggs
ea0886229e Update gam.cfg.md
Some checks failed
Push wiki / pushwiki (push) Has been cancelled
Build and test GAM / build (false, build, 1, Build Intel Ubuntu Jammy, ubuntu-22.04) (push) Has been cancelled
Build and test GAM / build (false, build, 10, Build x86_64 macOS 15, macos-15-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 11, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Intel Windows, windows-2025) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Arm Windows, windows-11-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 2, Build Intel Ubuntu Noble, ubuntu-24.04) (push) Has been cancelled
Build and test GAM / build (false, build, 3, Build Arm Ubuntu Noble, ubuntu-24.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 4, Build Arm Ubuntu Jammy, ubuntu-22.04-arm) (push) Has been cancelled
Build and test GAM / build (false, build, 5, Build Intel StaticX Legacy, ubuntu-22.04, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 6, Build Arm StaticX Legacy, ubuntu-22.04-arm, yes) (push) Has been cancelled
Build and test GAM / build (false, build, 8, Build Arm MacOS 14, macos-14) (push) Has been cancelled
Build and test GAM / build (false, build, 9, Build Arm MacOS 15, macos-15) (push) Has been cancelled
Build and test GAM / build (false, test, 14, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 15, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 18, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / merge (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
Check for Google Root CA Updates / check-certs (push) Has been cancelled
2026-02-03 13:53:45 -08:00
16 changed files with 211 additions and 55 deletions

View File

@@ -12,7 +12,7 @@ authors = [
dependencies = [ dependencies = [
"arrow>=1.3.0", "arrow>=1.3.0",
"chardet>=5.2.0", "chardet>=5.2.0",
"cryptography==46.0.3", "cryptography==46.0.5",
"distro; sys_platform=='linux'", "distro; sys_platform=='linux'",
"filelock>=3.18.0", "filelock>=3.18.0",
"google-api-python-client>=2.167.0", "google-api-python-client>=2.167.0",

View File

@@ -2789,21 +2789,23 @@ gam create chromepolicyimage <ChromePolicyImageSchemaName> <FileName>
gam update chromepolicy [convertcrnl] gam update chromepolicy [convertcrnl]
(<SchemaName> ((<Field> <Value>)+ | <JSONData>))+ (<SchemaName> ((<Field> <Value>)+ | <JSONData>))+
((ou|orgunit <OrgUnitItem>)|(cigroup <GroupItem>)) ((ou|orgunit <OrgUnitItem>)|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
gam delete chromepolicy gam delete chromepolicy
(<SchemaName> [<JSONData>])+ (<SchemaName> [<JSONData>])+
((ou|orgunit <OrgUnitItem>)|(cigroup <GroupItem>)) ((ou|orgunit <OrgUnitItem>)|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
gam show chromepolicies gam show chromepolicies
((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(cigroup <GroupItem>)) ((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
(filter <StringList>)* (namespace <NamespaceList>)* (filter <StringList>)* (namespace <NamespaceList>)*
[show all|direct|inherited]
[formatjson] [formatjson]
gam print chromepolicies [todrive <ToDriveAttribute>*] gam print chromepolicies [todrive <ToDriveAttribute>*]
((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(cigroup <GroupItem>)) ((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
(filter <StringList>)* (namespace <NamespaceList>)* (filter <StringList>)* (namespace <NamespaceList>)*
[show all|direct|inherited] [shownopolicy]
[[formatjson [quotechar <Character>]] [[formatjson [quotechar <Character>]]
<ChromePolicySchemaFieldName> ::= <ChromePolicySchemaFieldName> ::=
@@ -6166,6 +6168,7 @@ Display a users calendar settings
defaulteventlength| defaulteventlength|
format24hourtime| format24hourtime|
hideinvitations| hideinvitations|
hideinvitationssetting|
hideweekends| hideweekends|
locale| locale|
remindonrespondedeventsonly| remindonrespondedeventsonly|

View File

@@ -1,3 +1,25 @@
7.33.03
Fixed bug in `gam [<UserTypeEntity>] sendemail ... from <EmailAddress> replyto <EmailAddress>`
where an `<EmailAddress>` of the form `Text <user@domain.com>` had the `Text` removed.
7.33.02
Added `hideinvitationssetting` to `<UserCalendarSettingsField>` used by
`gam <UserTypeEntity> print|show calsettings`.
7.33.01
Added option `shownopolicy` to `gam print chromepolicies` that will display output like the following
if no policies apply to the selected OU or group.
```
gam print chromepolicies ou /Test appid chrome:emidddocikgklceeeifefomdnbkldhng namespace chrome.users.apps shownopolicy
Getting all Chrome Policies that match query (chrome.users.apps.*) for /Test
Got 0 Chrome Policies that matched query (chrome.users.apps.*) for /Test...
name,orgUnitPath,parentOrgUnitPath,direct,appId
noPolicy,/Test,/,False,chrome:emidddocikgklceeeifefomdnbkldhng
```
7.33.00 7.33.00
Added variable `developer_preview_apis` to `gam.cfg` that is a comma separated list of APIs requiring a Developer Preview key. Added variable `developer_preview_apis` to `gam.cfg` that is a comma separated list of APIs requiring a Developer Preview key.

View File

@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
""" """
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>' __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
__version__ = '7.33.00' __version__ = '7.33.03'
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)' __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
# pylint: disable=wrong-import-position # pylint: disable=wrong-import-position
@@ -1331,6 +1331,8 @@ def validateEmailAddressOrUID(emailAddressOrUID, checkPeople=True, ciGroupsAPI=F
return emailAddressOrUID return emailAddressOrUID
return emailAddressOrUID.find('@') != 0 and emailAddressOrUID.count('@') <= 1 return emailAddressOrUID.find('@') != 0 and emailAddressOrUID.count('@') <= 1
NAME_EMAIL_ADDRESS_PATTERN = re.compile(r'^(.*)<(.+)>$')
# Normalize user/group email address/uid # Normalize user/group email address/uid
# uid:12345abc -> 12345abc # uid:12345abc -> 12345abc
# foo -> foo@domain # foo -> foo@domain
@@ -1349,6 +1351,10 @@ def normalizeEmailAddressOrUID(emailAddressOrUID, noUid=False, checkForCustomerI
return cg.group(1) return cg.group(1)
if ciGroupsAPI and emailAddressOrUID.startswith('groups/'): if ciGroupsAPI and emailAddressOrUID.startswith('groups/'):
return emailAddressOrUID return emailAddressOrUID
if emailAddressOrUID.find('<') >= 0:
match = NAME_EMAIL_ADDRESS_PATTERN.match(emailAddressOrUID)
if match:
emailAddressOrUID = match.group(2)
atLoc = emailAddressOrUID.find('@') atLoc = emailAddressOrUID.find('@')
if atLoc == 0: if atLoc == 0:
return emailAddressOrUID[1:].lower() if not noLower else emailAddressOrUID[1:] return emailAddressOrUID[1:].lower() if not noLower else emailAddressOrUID[1:]
@@ -4147,7 +4153,7 @@ def SetGlobalVariables():
GC.Values[itemName] = _getCfgPassword(sectionName, itemName) GC.Values[itemName] = _getCfgPassword(sectionName, itemName)
elif varType == GC.TYPE_STRING: elif varType == GC.TYPE_STRING:
GC.Values[itemName] = _getCfgString(sectionName, itemName) GC.Values[itemName] = _getCfgString(sectionName, itemName)
elif varType in {GC.TYPE_STRINGLIST, GC.TYPE_HEADERFORCE, GC.TYPE_HEADERORDER}: elif varType in {GC.TYPE_STRINGLIST, GC.TYPE_HEADERFORCEREQUIRED, GC.TYPE_HEADERORDER}:
GC.Values[itemName] = _getCfgStringList(sectionName, itemName) GC.Values[itemName] = _getCfgStringList(sectionName, itemName)
elif varType == GC.TYPE_FILE: elif varType == GC.TYPE_FILE:
GC.Values[itemName] = _getCfgFile(sectionName, itemName) GC.Values[itemName] = _getCfgFile(sectionName, itemName)
@@ -4290,7 +4296,7 @@ def SetGlobalVariables():
if GM.Globals[GM.PID] == 0: if GM.Globals[GM.PID] == 0:
for itemName, itemEntry in sorted(GC.VAR_INFO.items()): for itemName, itemEntry in sorted(GC.VAR_INFO.items()):
varType = itemEntry[GC.VAR_TYPE] varType = itemEntry[GC.VAR_TYPE]
if varType in {GC.TYPE_HEADERFILTER, GC.TYPE_HEADERFORCE, GC.TYPE_HEADERORDER, GC.TYPE_ROWFILTER}: if varType in {GC.TYPE_HEADERFILTER, GC.TYPE_HEADERFORCEREQUIRED, GC.TYPE_HEADERORDER, GC.TYPE_ROWFILTER}:
GM.Globals[GM.PARSER].set(sectionName, itemName, '') GM.Globals[GM.PARSER].set(sectionName, itemName, '')
elif (varType == GC.TYPE_INTEGER) and itemName in {GC.CSV_INPUT_ROW_LIMIT, GC.CSV_OUTPUT_ROW_LIMIT}: elif (varType == GC.TYPE_INTEGER) and itemName in {GC.CSV_INPUT_ROW_LIMIT, GC.CSV_OUTPUT_ROW_LIMIT}:
GM.Globals[GM.PARSER].set(sectionName, itemName, '0') GM.Globals[GM.PARSER].set(sectionName, itemName, '0')
@@ -7328,8 +7334,6 @@ def _addEmbeddedImagesToMessage(message, embeddedImages):
except (IOError, UnicodeDecodeError) as e: except (IOError, UnicodeDecodeError) as e:
usageErrorExit(f'{imageFilename}: {str(e)}') usageErrorExit(f'{imageFilename}: {str(e)}')
NAME_EMAIL_ADDRESS_PATTERN = re.compile(r'^.*<(.+)>$')
# Send an email # Send an email
def send_email(msgSubject, msgBody, msgTo, i=0, count=0, clientAccess=False, msgFrom=None, msgReplyTo=None, def send_email(msgSubject, msgBody, msgTo, i=0, count=0, clientAccess=False, msgFrom=None, msgReplyTo=None,
html=False, charset=UTF8, attachments=None, embeddedImages=None, html=False, charset=UTF8, attachments=None, embeddedImages=None,
@@ -7351,8 +7355,11 @@ def send_email(msgSubject, msgBody, msgTo, i=0, count=0, clientAccess=False, msg
def cleanAddr(emailAddr): def cleanAddr(emailAddr):
match = NAME_EMAIL_ADDRESS_PATTERN.match(emailAddr) match = NAME_EMAIL_ADDRESS_PATTERN.match(emailAddr)
if match: if match:
return match.group(1) emailName = match.group(1)
return emailAddr emailAddr = normalizeEmailAddressOrUID(match.group(2), noUid=True, noLower=True)
return (f'{emailName} <{emailAddr}>', emailAddr)
emailAddr = normalizeEmailAddressOrUID(emailAddr, noUid=True, noLower=True)
return (emailAddr, emailAddr)
if msgFrom is None: if msgFrom is None:
msgFrom = _getAdminEmail() msgFrom = _getAdminEmail()
@@ -7372,9 +7379,9 @@ def send_email(msgSubject, msgBody, msgTo, i=0, count=0, clientAccess=False, msg
if embeddedImages: if embeddedImages:
_addEmbeddedImagesToMessage(message, embeddedImages) _addEmbeddedImagesToMessage(message, embeddedImages)
message['Subject'] = msgSubject message['Subject'] = msgSubject
message['From'] = normalizeEmailAddressOrUID(cleanAddr(msgFrom), noUid=True, noLower=True) message['From'], msgFromAddr = cleanAddr(msgFrom)
if msgReplyTo is not None: if msgReplyTo is not None:
message['Reply-To'] = normalizeEmailAddressOrUID(cleanAddr(msgReplyTo), noUid=True, noLower=True) message['Reply-To'], _ = cleanAddr(msgReplyTo)
if ccRecipients: if ccRecipients:
message['Cc'] = ccRecipients.lower() message['Cc'] = ccRecipients.lower()
if bccRecipients: if bccRecipients:
@@ -7384,8 +7391,8 @@ def send_email(msgSubject, msgBody, msgTo, i=0, count=0, clientAccess=False, msg
if header not in {'Subject', 'From', 'To', 'Reply-To', 'Cc', 'Bcc'}: if header not in {'Subject', 'From', 'To', 'Reply-To', 'Cc', 'Bcc'}:
message[header] = value message[header] = value
if mailBox is None: if mailBox is None:
mailBox = msgFrom mailBox = msgFromAddr
mailBoxAddr = normalizeEmailAddressOrUID(cleanAddr(mailBox), noUid=True, noLower=True) _, mailBoxAddr = cleanAddr(mailBox)
action = Act.Get() action = Act.Get()
Act.Set(Act.SENDEMAIL) Act.Set(Act.SENDEMAIL)
if not GC.Values[GC.SMTP_HOST]: if not GC.Values[GC.SMTP_HOST]:
@@ -30089,7 +30096,7 @@ CHROME_POLICY_SHOW_CHOICE_MAP = {
# ((ou|orgunit <OrgUnitItem>)|(group <GroupItem>)) # ((ou|orgunit <OrgUnitItem>)|(group <GroupItem>))
# [(printerid <PrinterID>)|(appid <AppID>)] # [(printerid <PrinterID>)|(appid <AppID>)]
# (filter <StringList>)* (namespace <NamespaceList>)* # (filter <StringList>)* (namespace <NamespaceList>)*
# [show all|direct|inherited] # [show all|direct|inherited] [shownopolicy]
# [[formatjson [quotechar <Character>]] # [[formatjson [quotechar <Character>]]
def doPrintShowChromePolicies(): def doPrintShowChromePolicies():
def normalizedPolicy(policy): def normalizedPolicy(policy):
@@ -30160,25 +30167,54 @@ def doPrintShowChromePolicies():
showJSON(None, policy, sortDictKeys=False) showJSON(None, policy, sortDictKeys=False)
Ind.Decrement() Ind.Decrement()
def _printPolicyRow(policy):
row = flattenJSON(policy)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif (not csvPF.rowFilter and not csvPF.rowDropFilter) or csvPF.CheckRowTitles(row):
if entityType == Ent.ORGANIZATIONAL_UNIT:
csvPF.WriteRowNoFilter({'name': policy['name'],
'orgUnitPath': policy['orgUnitPath'],
'parentOrgUnitPath': policy['parentOrgUnitPath'],
'direct': policy['direct'],
'JSON': json.dumps(cleanJSON(policy),
ensure_ascii=False, sort_keys=True)})
else:
csvPF.WriteRowNoFilter({'name': policy['name'],
'group': policy['group'],
'JSON': json.dumps(cleanJSON(policy),
ensure_ascii=False, sort_keys=True)})
def _printPolicy(policy): def _printPolicy(policy):
nonlocal policiesShown
policy = normalizedPolicy(policy) policy = normalizedPolicy(policy)
if (entityType == Ent.GROUP) or showPolicies in (CHROME_POLICY_SHOW_ALL, policy['direct']): if (entityType == Ent.GROUP) or showPolicies in (CHROME_POLICY_SHOW_ALL, policy['direct']):
row = flattenJSON(policy) policiesShown += 1
if not FJQC.formatJSON: _printPolicyRow(policy)
csvPF.WriteRowTitles(row)
elif (not csvPF.rowFilter and not csvPF.rowDropFilter) or csvPF.CheckRowTitles(row): def _printNoPolicy():
if entityType == Ent.ORGANIZATIONAL_UNIT: nonlocal targetName
csvPF.WriteRowNoFilter({'name': policy['name'], policy = {'name': 'noPolicy'}
'orgUnitPath': policy['orgUnitPath'], if app_id:
'parentOrgUnitPath': policy['parentOrgUnitPath'], policy['appId'] = app_id
'direct': policy['direct'], elif printer_id:
'JSON': json.dumps(cleanJSON(policy), policy['printerId'] = printer_id
ensure_ascii=False, sort_keys=True)}) if entityType == Ent.ORGANIZATIONAL_UNIT:
else: policy['orgUnitPath'] = targetName
csvPF.WriteRowNoFilter({'name': policy['name'], if targetName == '/':
'group': policy['group'], policy['parentOrgUnitPath'] = '/'
'JSON': json.dumps(cleanJSON(policy), else:
ensure_ascii=False, sort_keys=True)}) targetName = makeOrgUnitPathRelative(targetName)
policy['parentOrgUnitPath'] = callGAPI(cd.orgunits(), 'get',
throwReasons=GAPI.ORGUNIT_GET_THROW_REASONS,
customerId=GC.Values[GC.CUSTOMER_ID],
orgUnitPath=encodeOrgUnitPath(targetName),
fields='parentOrgUnitPath')['parentOrgUnitPath']
policy['direct'] = False
else:
policy['group'] = targetName
_printPolicyRow(policy)
cp = buildGAPIObject(API.CHROMEPOLICY) cp = buildGAPIObject(API.CHROMEPOLICY)
cd = buildGAPIObject(API.DIRECTORY) cd = buildGAPIObject(API.DIRECTORY)
@@ -30190,6 +30226,8 @@ def doPrintShowChromePolicies():
app_id = groupEmail = orgUnit = printer_id = targetResource = None app_id = groupEmail = orgUnit = printer_id = targetResource = None
showPolicies = CHROME_POLICY_SHOW_ALL showPolicies = CHROME_POLICY_SHOW_ALL
psFilters = [] psFilters = []
showNoPolicy = False
policiesShown = 0
while Cmd.ArgumentsRemaining(): while Cmd.ArgumentsRemaining():
myarg = getArgument() myarg = getArgument()
if csvPF and myarg == 'todrive': if csvPF and myarg == 'todrive':
@@ -30213,6 +30251,8 @@ def doPrintShowChromePolicies():
psFilters.append(f'{psFilter}.*') psFilters.append(f'{psFilter}.*')
elif myarg == 'show': elif myarg == 'show':
showPolicies = getChoice(CHROME_POLICY_SHOW_CHOICE_MAP, mapChoice=True) showPolicies = getChoice(CHROME_POLICY_SHOW_CHOICE_MAP, mapChoice=True)
elif csvPF and myarg == 'shownopolicy':
showNoPolicy = True
else: else:
FJQC.GetFormatJSONQuoteChar(myarg, False) FJQC.GetFormatJSONQuoteChar(myarg, False)
checkPolicyArgs(targetResource, printer_id, app_id) checkPolicyArgs(targetResource, printer_id, app_id)
@@ -30302,7 +30342,8 @@ def doPrintShowChromePolicies():
else: else:
for policy in policies: for policy in policies:
_printPolicy(policy) _printPolicy(policy)
if csvPF: if showNoPolicy and policiesShown == 0:
_printNoPolicy()
csvPF.writeCSVfile(f'Chrome Policies - {targetName}') csvPF.writeCSVfile(f'Chrome Policies - {targetName}')
CHROME_IMAGE_SCHEMAS_MAP = { CHROME_IMAGE_SCHEMAS_MAP = {
@@ -54147,6 +54188,7 @@ USER_CALENDAR_SETTINGS_FIELDS_CHOICE_MAP = {
'defaulteventlength': 'defaultEventLength', 'defaulteventlength': 'defaultEventLength',
'format24hourtime': 'format24HourTime', 'format24hourtime': 'format24HourTime',
'hideinvitations': 'hideInvitations', 'hideinvitations': 'hideInvitations',
'hideinvitationssetting': 'hideInvitationsSetting',
'hideweekends': 'hideWeekends', 'hideweekends': 'hideWeekends',
'locale': 'locale', 'locale': 'locale',
'remindonrespondedeventsonly': 'remindOnRespondedEventsOnly', 'remindonrespondedeventsonly': 'remindOnRespondedEventsOnly',

View File

@@ -123,6 +123,8 @@ CSV_OUTPUT_HEADER_DROP_FILTER = 'csv_output_header_drop_filter'
CSV_OUTPUT_HEADER_FORCE = 'csv_output_header_force' CSV_OUTPUT_HEADER_FORCE = 'csv_output_header_force'
# Orde output column headers # Orde output column headers
CSV_OUTPUT_HEADER_ORDER = 'csv_output_header_order' CSV_OUTPUT_HEADER_ORDER = 'csv_output_header_order'
# Required output column headers
CSV_OUTPUT_HEADER_REQUIRED = 'csv_output_header_required'
# Line terminator in CSV output file # Line terminator in CSV output file
CSV_OUTPUT_LINE_TERMINATOR = 'csv_output_line_terminator' CSV_OUTPUT_LINE_TERMINATOR = 'csv_output_line_terminator'
# Quote character in CSV output file # Quote character in CSV output file
@@ -329,6 +331,7 @@ CSV_INPUT_ROW_FILTER_ITEMS = {CSV_INPUT_ROW_FILTER, CSV_INPUT_ROW_FILTER_MODE,
CSV_OUTPUT_ROW_FILTER_ITEMS = {CSV_OUTPUT_HEADER_FILTER, CSV_OUTPUT_HEADER_DROP_FILTER, CSV_OUTPUT_ROW_FILTER_ITEMS = {CSV_OUTPUT_HEADER_FILTER, CSV_OUTPUT_HEADER_DROP_FILTER,
CSV_OUTPUT_HEADER_FORCE, CSV_OUTPUT_HEADER_ORDER, CSV_OUTPUT_HEADER_FORCE, CSV_OUTPUT_HEADER_ORDER,
# CSV_OUTPUT_HEADER_REQUIRED,
CSV_OUTPUT_ROW_FILTER, CSV_OUTPUT_ROW_FILTER_MODE, CSV_OUTPUT_ROW_FILTER, CSV_OUTPUT_ROW_FILTER_MODE,
CSV_OUTPUT_ROW_DROP_FILTER, CSV_OUTPUT_ROW_DROP_FILTER_MODE, CSV_OUTPUT_ROW_DROP_FILTER, CSV_OUTPUT_ROW_DROP_FILTER_MODE,
CSV_OUTPUT_ROW_LIMIT} CSV_OUTPUT_ROW_LIMIT}
@@ -373,6 +376,7 @@ Defaults = {
CSV_OUTPUT_HEADER_DROP_FILTER: '', CSV_OUTPUT_HEADER_DROP_FILTER: '',
CSV_OUTPUT_HEADER_FORCE: '', CSV_OUTPUT_HEADER_FORCE: '',
CSV_OUTPUT_HEADER_ORDER: '', CSV_OUTPUT_HEADER_ORDER: '',
# CSV_OUTPUT_HEADER_REQUIRED: '',
CSV_OUTPUT_LINE_TERMINATOR: 'lf', CSV_OUTPUT_LINE_TERMINATOR: 'lf',
CSV_OUTPUT_QUOTE_CHAR: '\'"\'', CSV_OUTPUT_QUOTE_CHAR: '\'"\'',
CSV_OUTPUT_ROW_FILTER: '', CSV_OUTPUT_ROW_FILTER: '',
@@ -487,7 +491,7 @@ TYPE_EMAIL_OPTIONAL = 'emao'
TYPE_FILE = 'file' TYPE_FILE = 'file'
TYPE_FLOAT = 'floa' TYPE_FLOAT = 'floa'
TYPE_HEADERFILTER = 'heaf' TYPE_HEADERFILTER = 'heaf'
TYPE_HEADERFORCE = 'hefo' TYPE_HEADERFORCEREQUIRED = 'hefr'
TYPE_HEADERORDER = 'heor' TYPE_HEADERORDER = 'heor'
TYPE_INTEGER = 'inte' TYPE_INTEGER = 'inte'
TYPE_LANGUAGE = 'lang' TYPE_LANGUAGE = 'lang'
@@ -544,8 +548,9 @@ VAR_INFO = {
CSV_OUTPUT_FIELD_DELIMITER: {VAR_TYPE: TYPE_CHARACTER}, CSV_OUTPUT_FIELD_DELIMITER: {VAR_TYPE: TYPE_CHARACTER},
CSV_OUTPUT_HEADER_FILTER: {VAR_TYPE: TYPE_HEADERFILTER}, CSV_OUTPUT_HEADER_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
CSV_OUTPUT_HEADER_DROP_FILTER: {VAR_TYPE: TYPE_HEADERFILTER}, CSV_OUTPUT_HEADER_DROP_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
CSV_OUTPUT_HEADER_FORCE: {VAR_TYPE: TYPE_HEADERFORCE}, CSV_OUTPUT_HEADER_FORCE: {VAR_TYPE: TYPE_HEADERFORCEREQUIRED},
CSV_OUTPUT_HEADER_ORDER: {VAR_TYPE: TYPE_HEADERORDER}, CSV_OUTPUT_HEADER_ORDER: {VAR_TYPE: TYPE_HEADERORDER},
# CSV_OUTPUT_HEADER_REQUIRED: {VAR_TYPE: TYPE_HEADERFORCEREQUIRED},
CSV_OUTPUT_LINE_TERMINATOR: {VAR_TYPE: TYPE_CHOICE, VAR_CHOICES: {'cr': '\r', 'lf': '\n', 'crlf': '\r\n'}}, CSV_OUTPUT_LINE_TERMINATOR: {VAR_TYPE: TYPE_CHOICE, VAR_CHOICES: {'cr': '\r', 'lf': '\n', 'crlf': '\r\n'}},
CSV_OUTPUT_QUOTE_CHAR: {VAR_TYPE: TYPE_CHARACTER}, CSV_OUTPUT_QUOTE_CHAR: {VAR_TYPE: TYPE_CHARACTER},
CSV_OUTPUT_ROW_FILTER: {VAR_TYPE: TYPE_ROWFILTER}, CSV_OUTPUT_ROW_FILTER: {VAR_TYPE: TYPE_ROWFILTER},

View File

@@ -69,6 +69,8 @@ CSV_OUTPUT_HEADER_FILTER = 'cohf'
CSV_OUTPUT_HEADER_FORCE = 'cofh' CSV_OUTPUT_HEADER_FORCE = 'cofh'
# Order output column headers # Order output column headers
CSV_OUTPUT_HEADER_ORDER = 'coho' CSV_OUTPUT_HEADER_ORDER = 'coho'
# Required output column headers
CSV_OUTPUT_HEADER_REQUIRED = 'corh'
# No escape character in CSV output file # No escape character in CSV output file
CSV_OUTPUT_NO_ESCAPE_CHAR = 'cone' CSV_OUTPUT_NO_ESCAPE_CHAR = 'cone'
# Quote character in CSV output file # Quote character in CSV output file
@@ -248,6 +250,7 @@ Globals = {
CSV_OUTPUT_HEADER_FILTER: [], CSV_OUTPUT_HEADER_FILTER: [],
CSV_OUTPUT_HEADER_FORCE: [], CSV_OUTPUT_HEADER_FORCE: [],
CSV_OUTPUT_HEADER_ORDER: [], CSV_OUTPUT_HEADER_ORDER: [],
# CSV_OUTPUT_HEADER_REQUIRED: [],
CSV_OUTPUT_NO_ESCAPE_CHAR: None, CSV_OUTPUT_NO_ESCAPE_CHAR: None,
CSV_OUTPUT_QUOTE_CHAR: None, CSV_OUTPUT_QUOTE_CHAR: None,
CSV_OUTPUT_ROW_DROP_FILTER: [], CSV_OUTPUT_ROW_DROP_FILTER: [],

View File

@@ -282,10 +282,11 @@ gam show chromepolicies
((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>)) ((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
[filter <StringList>] [namespace <NamespaceList>] [filter <StringList>] [namespace <NamespaceList>]
[show all|direct|inherited]
[formatjson] [formatjson]
``` ```
By default, all Chrome policies for the OU or group are displayed. By default, all Chrome policies for the OU or group are displayed.
* `filter <String>` - Display policies based on fields like its resource name, description and additionalTargetKeyNames. * `filter <StringList>` - Display policies based on fields like its resource name, description and additionalTargetKeyNames.
* `show all` - For OUs, display policies regardless of where set; this is the default * `show all` - For OUs, display policies regardless of where set; this is the default
* `show direct` - For OUs, display policies set directly in the OU * `show direct` - For OUs, display policies set directly in the OU
* `show inherited` - For OUs, display policies set in a parent OU * `show inherited` - For OUs, display policies set in a parent OU
@@ -329,15 +330,25 @@ By default, Gam displays the information as an indented list of keys and values.
gam print chromepolicies [todrive <ToDriveAttribute>*] gam print chromepolicies [todrive <ToDriveAttribute>*]
((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>)) ((ou|orgunit <OrgUnitItem> [show all|direct|inherited])|(group <GroupItem>))
[(printerid <PrinterID>)|(appid <AppID>)] [(printerid <PrinterID>)|(appid <AppID>)]
[filter <String>] [namespace <NamespaceList>] [filter <StringList>] [namespace <NamespaceList>]
[show all|direct|inherited] [shownopolicy]
[[formatjson [quotechar <Character>]] [[formatjson [quotechar <Character>]]
``` ```
By default, all Chrome policies for the OU or group are displayed. By default, all Chrome policies for the OU or group are displayed.
* `filter <String>` - Display policies based on fields like its resource name, description and additionalTargetKeyNames. * `filter <StringList>` - Display policies based on fields like its resource name, description and additionalTargetKeyNames.
* `show all` - For OUs, display policies regardless of where set; this is the default * `show all` - For OUs, display policies regardless of where set; this is the default
* `show direct` - For OUs, display policies set directly in the OU * `show direct` - For OUs, display policies set directly in the OU
* `show inherited` - For OUs, display policies set in a parent OU * `show inherited` - For OUs, display policies set in a parent OU
Use option `shownopolicy` to display output like the following if no policies apply to the OU or group.
```
gam print chromepolicies ou /Test appid chrome:emidddocikgklceeeifefomdnbkldhng namespace chrome.users.apps shownopolicy
Getting all Chrome Policies that match query (chrome.users.apps.*) for /Test
Got 0 Chrome Policies that matched query (chrome.users.apps.*) for /Test...
name,orgUnitPath,parentOrgUnitPath,direct,appId
noPolicy,/Test,/,False,chrome:emidddocikgklceeeifefomdnbkldhng
```
These are the default namespaces; use `namespace <NamespaceList>` to override. These are the default namespaces; use `namespace <NamespaceList>` to override.
* `default` * `default`
* chrome.users * chrome.users

View File

@@ -10,6 +10,28 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
### 7.33.03
Fixed bug in `gam [<UserTypeEntity>] sendemail ... from <EmailAddress> replyto <EmailAddress>`
where an `<EmailAddress>` of the form `Text <user@domain.com>` had the `Text` removed.
### 7.33.02
Added `hideinvitationssetting` to `<UserCalendarSettingsField>` used by
`gam <UserTypeEntity> print|show calsettings`.
### 7.33.01
Added option `shownopolicy` to `gam print chromepolicies` that will display output like the following
if no policies apply to the selected OU or group.
```
gam print chromepolicies ou /Test appid chrome:emidddocikgklceeeifefomdnbkldhng namespace chrome.users.apps shownopolicy
Getting all Chrome Policies that match query (chrome.users.apps.*) for /Test
Got 0 Chrome Policies that matched query (chrome.users.apps.*) for /Test...
name,orgUnitPath,parentOrgUnitPath,direct,appId
noPolicy,/Test,/,False,chrome:emidddocikgklceeeifefomdnbkldhng
```
### 7.33.00 ### 7.33.00
Added variable `developer_preview_apis` to `gam.cfg` that is a comma separated list of APIs requiring a Developer Preview key. Added variable `developer_preview_apis` to `gam.cfg` that is a comma separated list of APIs requiring a Developer Preview key.

View File

@@ -252,7 +252,7 @@ writes the credentials into the file oauth2.txt.
admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
admin@server:/Users/admin$ gam version admin@server:/Users/admin$ gam version
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
GAM 7.33.00 - https://github.com/GAM-team/GAM - pyinstaller GAM 7.33.03 - https://github.com/GAM-team/GAM - pyinstaller
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
macOS Tahoe 26.2 x86_64 macOS Tahoe 26.2 x86_64
@@ -1034,7 +1034,7 @@ writes the credentials into the file oauth2.txt.
C:\>del C:\GAMConfig\oauth2.txt C:\>del C:\GAMConfig\oauth2.txt
C:\>gam version C:\>gam version
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
GAM 7.33.00 - https://github.com/GAM-team/GAM - pythonsource GAM 7.33.03 - https://github.com/GAM-team/GAM - pythonsource
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
Windows 11 10.0.26200 AMD64 Windows 11 10.0.26200 AMD64

View File

@@ -0,0 +1,34 @@
# Secondary Calendars with no Owner
Here's a start on how to get information for non-owned secondary calendars
Save the CSV file that Google sent you as NoOwnerSecCals.csv
Get calendar description and summary for non-owned secondary calendars.
* There will be one row per calendar.
```
gam config num_threads 10 csv_output_header_force "calendarId,description,summary" redirect csv ./NOSC_Details.csv multiprocess redirect stderr - multiprocess csv NoOwnerSecCals.csv gam calendar "~Secondary calendar email" print settings fields description,summary
```
Get event counts for non-owned secondary calendars.
* There will be one row per calendar.
```
gam config num_threads 10 redirect csv ./NOSC_EventCounts.csv multiprocess redirect stderr - multiprocess csv NOSC_Details.csv gam calendar "~calendarId" print events countsonly addcsvdata description "~description" addcsvdata summary "~summary"
```
Get summary for non-owned secondary calendars - Contains details, counts, ACLs
* There will be one row per calendar/ACL combination
```
gam config num_threads 10 redirect csv ./NOSC_Summary.csv multiprocess redirect stderr - multiprocess csv NOSC_EventCounts.csv gam calendar "~calendarId" print acls noselfowner addcsvdata description "~description" addcsvdata summary "~summary" addcsvdata events "~events"
```
You can add an owner.
* Replace `admin@domain.com` with a super admin other than the one from: `gam oauth info`
```
gam config num_threads 10 redirect stdout ./Add_NOSC_Owner.txt multiprocess redirect stderr stdout csv NoOwnerSecCals.csv gam calendar "~Secondary calendar email" add acls owner admin@domain.com sendnotifications false
```
After inspecting NOSC_Summary.csv, you can delete the calendars if desired.
* Replace `admin@domain.com` with the super admin specified in the previous step
```
gam config num_threads 10 redirect stdout ./Delete_NOSC.txt multiprocess redirect stderr stdout csv NoOwnerSecCals.csv gam user admin@domain.com remove calendar "~Secondary calendar email"
``

View File

@@ -101,6 +101,7 @@
defaulteventlength| defaulteventlength|
format24hourtime| format24hourtime|
hideinvitations| hideinvitations|
hideinvitationssetting|
hideweekends| hideweekends|
locale| locale|
remindonrespondedeventsonly| remindonrespondedeventsonly|

View File

@@ -3,7 +3,8 @@
- [API documentation](#api-documentation) - [API documentation](#api-documentation)
- [Definitions](#definitions) - [Definitions](#definitions)
- [Aliases](#aliases) - [Aliases](#aliases)
- [Delegation Notification](#delegation-notification) - [Delegator Banner](#delegator-banner)
- [Delegate Notification](#delegate-notification)
- [Create Gmail delegates](#create-gmail-delegates) - [Create Gmail delegates](#create-gmail-delegates)
- [Delete Gmail delegates](#delete-gmail-delegates) - [Delete Gmail delegates](#delete-gmail-delegates)
- [Update Gmail delegates](#update-gmail-delegates) - [Update Gmail delegates](#update-gmail-delegates)
@@ -57,7 +58,13 @@ The `convertalias` option causes GAM to make an extra API call per user in `<Use
to convert aliases to primary email addresses. If you know that all of the email addresses to convert aliases to primary email addresses. If you know that all of the email addresses
in `<UserEntity>` are primary, you can omit `convertalias` and avoid the extra API calls. in `<UserEntity>` are primary, you can omit `convertalias` and avoid the extra API calls.
## Delegation Notification ## Delegator Banner
When creating a delegate, the following banner is displayed in the delegator's Gmail inbox, it can not be suppressed.
```
<Delegate> now has delegated access to your account. This notice will end in 7 days.
```
## Delegate Notification
When creating a delegate, you can send a message to the delegate. When creating a delegate, you can send a message to the delegate.
``` ```
[notify [<Boolean>] [notify [<Boolean>]

View File

@@ -586,6 +586,9 @@ Getting all Groups for testuser1@domain.com (1/2)
Getting all Groups for testuser2@domain.com (2/2) Getting all Groups for testuser2@domain.com (2/2)
User,Groups,GroupsList User,Groups,GroupsList
testuser2@domain.com,0, testuser2@domain.com,0,
# Get group membership for all users
$ gam config auto_batch_min 1 num_threads 10 redirect csv ./UsersGroups.csv multiprocess sortheaders User,Group redirect stderr - multiprocess all users print groups
``` ```
### Display groups and their parents ### Display groups and their parents
Display a user's groups and their parents as an indented list. Display a user's groups and their parents as an indented list.

View File

@@ -3,7 +3,7 @@
Print the current version of Gam with details Print the current version of Gam with details
``` ```
gam version gam version
GAM 7.33.00 - https://github.com/GAM-team/GAM - pyinstaller GAM 7.33.03 - https://github.com/GAM-team/GAM - pyinstaller
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
macOS Tahoe 26.2 x86_64 macOS Tahoe 26.2 x86_64
@@ -15,7 +15,7 @@ Time: 2025-12-23T13:57:00-08:00
Print the current version of Gam with details and time offset information Print the current version of Gam with details and time offset information
``` ```
gam version timeoffset gam version timeoffset
GAM 7.33.00 - https://github.com/GAM-team/GAM - pyinstaller GAM 7.33.03 - https://github.com/GAM-team/GAM - pyinstaller
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
macOS Tahoe 26.2 x86_64 macOS Tahoe 26.2 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
Print the current version of Gam with extended details and SSL information Print the current version of Gam with extended details and SSL information
``` ```
gam version extended gam version extended
GAM 7.33.00 - https://github.com/GAM-team/GAM - pyinstaller GAM 7.33.03 - https://github.com/GAM-team/GAM - pyinstaller
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
macOS Tahoe 26.2 x86_64 macOS Tahoe 26.2 x86_64
@@ -68,7 +68,7 @@ MacOS High Sierra 10.13.6 x86_64
Path: /Users/Admin/bin/gam7 Path: /Users/Admin/bin/gam7
Version Check: Version Check:
Current: 5.35.08 Current: 5.35.08
Latest: 7.33.00 Latest: 7.33.03
echo $? echo $?
1 1
``` ```
@@ -76,7 +76,7 @@ echo $?
Print the current version number without details Print the current version number without details
``` ```
gam version simple gam version simple
7.33.00 7.33.03
``` ```
In Linux/MacOS you can do: In Linux/MacOS you can do:
``` ```
@@ -86,7 +86,7 @@ echo $VER
Print the current version of Gam and address of this Wiki Print the current version of Gam and address of this Wiki
``` ```
gam help gam help
GAM 7.33.00 - https://github.com/GAM-team/GAM GAM 7.33.03 - https://github.com/GAM-team/GAM
GAM Team <google-apps-manager@googlegroups.com> GAM Team <google-apps-manager@googlegroups.com>
Python 3.14.2 64-bit final Python 3.14.2 64-bit final
macOS Tahoe 26.2 x86_64 macOS Tahoe 26.2 x86_64

View File

@@ -74,6 +74,7 @@ Client Access
* [Calendars](Calendars) * [Calendars](Calendars)
* [Calendars - Access](Calendars-Access) * [Calendars - Access](Calendars-Access)
* [Calendars - Events](Calendars-Events) * [Calendars - Events](Calendars-Events)
* [Calendars - Secondary Calendars with no Owner](No-Owner-Secondary-Calendars)
* [Chrome Auto Update Expiration Counts](Chrome-AUE-Counts) * [Chrome Auto Update Expiration Counts](Chrome-AUE-Counts)
* [Chrome Browser Cloud Management](Chrome-Browser-Cloud-Management) * [Chrome Browser Cloud Management](Chrome-Browser-Cloud-Management)
* [Chrome Device Counts](Chrome-Device-Counts) * [Chrome Device Counts](Chrome-Device-Counts)

View File

@@ -311,12 +311,14 @@ developer_preview_apis
A comma separated list of APIs requiring a Developer Preview key. A comma separated list of APIs requiring a Developer Preview key.
Default: Blank Default: Blank
Valid values: Valid values:
accesscontextmanager,admin,alertcenter,analyticsadmin,calendar-json,cbcm,chat,chromemanagement,chromepolicy, accesscontextmanager,admin,alertcenter,analyticsadmin,calendar-json,cbcm,chat,
classroom,cloudchannel,cloudidentity,cloudresourcemanager,contactdelegation,contacts,datastudio,docs,drive, chromemanagement,chromepolicy,classroom,cloudchannel,cloudidentity,
driveactivity,drivelabels,email-audit,forms,gmail,groupsmigration,groupssettings,iam,iamcredentials,keep, cloudresourcemanager,contactdelegation,contacts,datastudio,docs,drive,
licensing,meet,mybusinessaccountmanagement,oauth2,orgpolicy,people,pubsub,reseller,searchconsole, driveactivity,drivelabels,email-audit,forms,gmail,groupsmigration,groupssettings,
serviceaccountlookup,servicemanagement,serviceusage,sheets,siteVerification,storage,tagmanager,tasks,vault, iam,iamcredentials,keep,licensing,meet,mybusinessaccountmanagement,oauth2,
versionhistory,youtube orgpolicy,people,pubsub,reseller,searchconsole,serviceaccountlookup,
servicemanagement,serviceusage,sheets,siteVerification,storage,tagmanager,tasks,
vault,versionhistory,youtube
developer_preview_api_key developer_preview_api_key
A Developer Preview API key that is passed to all API calls for APIs in developer_preview_apis A Developer Preview API key that is passed to all API calls for APIs in developer_preview_apis
Default: Blank Default: Blank