Update guest user support #1874

This commit is contained in:
Ross Scroggs
2026-04-27 19:47:49 -07:00
parent 0f50ce18b3
commit 4075bef468
5 changed files with 86 additions and 14 deletions

View File

@@ -916,6 +916,8 @@ Specify a collection of Users by directly specifying them or by specifying items
<UserTypeEntity> ::= <UserTypeEntity> ::=
(all users|users_na|users_arch|users_ns|users_susp|users_arch_or_susp|users_na_ns|users_ns_susp)| (all users|users_na|users_arch|users_ns|users_susp|users_arch_or_susp|users_na_ns|users_ns_susp)|
(all guests|guests_ns|guests_susp|guests_ns_susp)|
(all users_and_guests|users_and_guests_ns|users_and_guests_susp|users_and_guests_ns_susp)|
(user <UserItem>)| (user <UserItem>)|
(users <UserList>)| (users <UserList>)|
(oauthuser) (oauthuser)

View File

@@ -1,3 +1,10 @@
7.43.00
Updated `gam info user` to display guest user attributes: `isGuestUser, guestAccountInfo`
Expanded `<UserTypeEntity>` to allow specification of guest users.
* See [Collections of Users](Collections-of-Users)
7.42.00 7.42.00
In versions prior to 7.42.00, when `redirect csv <FileName>` was used, GAM did not open and write `<FileName>` In versions prior to 7.42.00, when `redirect csv <FileName>` was used, GAM did not open and write `<FileName>`

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.42.00' __version__ = '7.43.00'
__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
@@ -46929,10 +46929,15 @@ USER_NAME_PROPERTY_PRINT_ORDER = [
'fullName', 'fullName',
'displayName', 'displayName',
] ]
USER_GUEST_PROPERTY_PRINT_ORDER = [
'primaryGuestEmail',
]
USER_LANGUAGE_PROPERTY_PRINT_ORDER = [ USER_LANGUAGE_PROPERTY_PRINT_ORDER = [
'languages', 'languages',
] ]
USER_SCALAR_PROPERTY_PRINT_ORDER = [ USER_SCALAR_PROPERTY_PRINT_ORDER = [
'isGuestUser',
'guestAccountInfo',
'isAdmin', 'isAdmin',
'isDelegatedAdmin', 'isDelegatedAdmin',
'isEnrolledIn2Sv', 'isEnrolledIn2Sv',
@@ -47050,7 +47055,7 @@ USER_FIELDS_CHOICE_MAP = {
'gal': 'includeInGlobalAddressList', 'gal': 'includeInGlobalAddressList',
'gender': ['gender.type', 'gender.customGender', 'gender.addressMeAs'], 'gender': ['gender.type', 'gender.customGender', 'gender.addressMeAs'],
'givenname': 'name.givenName', 'givenname': 'name.givenName',
'guestaccountinfo': 'guestAccountInfo', 'guestaccountinfo': ['guestAccountInfo.primaryGuestEmail'],
'id': 'id', 'id': 'id',
'im': 'ims', 'im': 'ims',
'ims': 'ims', 'ims': 'ims',
@@ -47368,17 +47373,23 @@ def infoUsers(entityList):
Ind.Increment() Ind.Increment()
printKeyValueList(['Settings', None]) printKeyValueList(['Settings', None])
Ind.Increment() Ind.Increment()
if 'name' in user: up = 'name'
for up in USER_NAME_PROPERTY_PRINT_ORDER: if up in user:
if up in user['name']: for nup in USER_NAME_PROPERTY_PRINT_ORDER:
printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], user['name'][up]]) if nup in user[up]:
printKeyValueList([UProp.PROPERTIES[nup][UProp.TITLE], user[up][nup]])
up = 'languages' up = 'languages'
if up in user: if up in user:
printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], _formatLanguagesList(user[up], ',')]) printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], _formatLanguagesList(user[up], ',')])
for up in USER_SCALAR_PROPERTY_PRINT_ORDER: for up in USER_SCALAR_PROPERTY_PRINT_ORDER:
if up in user: if up in user:
if up not in USER_TIME_OBJECTS: if up not in USER_TIME_OBJECTS:
if up != 'guestAccountInfo':
printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], user[up]]) printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], user[up]])
else:
for gup in USER_GUEST_PROPERTY_PRINT_ORDER:
if gup in user[up]:
printKeyValueList([UProp.PROPERTIES[gup][UProp.TITLE], user[up][gup]])
else: else:
printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], formatLocalTime(user[up])]) printKeyValueList([UProp.PROPERTIES[up][UProp.TITLE], formatLocalTime(user[up])])
Ind.Decrement() Ind.Decrement()

View File

@@ -114,6 +114,14 @@ class GamCLArgs():
ENTITY_USERS_NA_NS = 'users_na_ns' ENTITY_USERS_NA_NS = 'users_na_ns'
ENTITY_USERS_ARCH_OR_SUSP = 'users_arch_or_susp' ENTITY_USERS_ARCH_OR_SUSP = 'users_arch_or_susp'
ENTITY_USERS_NS_SUSP = 'users_ns_susp' ENTITY_USERS_NS_SUSP = 'users_ns_susp'
ENTITY_USERS_AND_GUESTS = 'users_and_guests'
ENTITY_USERS_AND_GUESTS_NS = 'users_and_guests_ns'
ENTITY_USERS_AND_GUESTS_SUSP = 'users_and_guests_susp'
ENTITY_USERS_AND_GUESTS_NS_SUSP = 'users_and_guests_ns_susp'
ENTITY_GUESTS = 'guests'
ENTITY_GUESTS_NS = 'guests_ns'
ENTITY_GUESTS_SUSP = 'guests_susp'
ENTITY_GUESTS_NS_SUSP = 'guests_ns_susp'
# #
BROWSER_ENTITIES = [ BROWSER_ENTITIES = [
ENTITY_BROWSER, ENTITY_BROWSER,
@@ -398,6 +406,14 @@ class GamCLArgs():
ENTITY_USERS_ARCH_OR_SUSP, ENTITY_USERS_ARCH_OR_SUSP,
ENTITY_USERS_NA_NS, ENTITY_USERS_NA_NS,
ENTITY_USERS_NS_SUSP, ENTITY_USERS_NS_SUSP,
ENTITY_USERS_AND_GUESTS,
ENTITY_USERS_AND_GUESTS_NS,
ENTITY_USERS_AND_GUESTS_SUSP,
ENTITY_USERS_AND_GUESTS_NS_SUSP,
ENTITY_GUESTS,
ENTITY_GUESTS_NS,
ENTITY_GUESTS_SUSP,
ENTITY_GUESTS_NS_SUSP,
] ]
# #
ENTITY_ALL_CROS = ENTITY_SELECTOR_ALL+' '+ENTITY_CROS ENTITY_ALL_CROS = ENTITY_SELECTOR_ALL+' '+ENTITY_CROS
@@ -409,6 +425,14 @@ class GamCLArgs():
ENTITY_ALL_USERS_NA_NS = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_NA_NS ENTITY_ALL_USERS_NA_NS = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_NA_NS
ENTITY_ALL_USERS_ARCH_OR_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_ARCH_OR_SUSP ENTITY_ALL_USERS_ARCH_OR_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_ARCH_OR_SUSP
ENTITY_ALL_USERS_NS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_NS_SUSP ENTITY_ALL_USERS_NS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_NS_SUSP
ENTITY_ALL_USERS_AND_GUESTS = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_AND_GUESTS
ENTITY_ALL_USERS_AND_GUESTS_NS = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_AND_GUESTS_NS
ENTITY_ALL_USERS_AND_GUESTS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_AND_GUESTS_SUSP
ENTITY_ALL_USERS_AND_GUESTS_NS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_USERS_AND_GUESTS_NS_SUSP
ENTITY_ALL_GUESTS = ENTITY_SELECTOR_ALL+' '+ENTITY_GUESTS
ENTITY_ALL_GUESTS_NS = ENTITY_SELECTOR_ALL+' '+ENTITY_GUESTS_NS
ENTITY_ALL_GUESTS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_GUESTS_SUSP
ENTITY_ALL_GUESTS_NS_SUSP = ENTITY_SELECTOR_ALL+' '+ENTITY_GUESTS_NS_SUSP
# #
ALL_USER_ENTITY_TYPES = { ALL_USER_ENTITY_TYPES = {
ENTITY_ALL_USERS, ENTITY_ALL_USERS,
@@ -418,6 +442,14 @@ class GamCLArgs():
ENTITY_ALL_USERS_SUSP, ENTITY_ALL_USERS_SUSP,
ENTITY_ALL_USERS_NA_NS, ENTITY_ALL_USERS_NA_NS,
ENTITY_ALL_USERS_NS_SUSP, ENTITY_ALL_USERS_NS_SUSP,
ENTITY_ALL_USERS_AND_GUESTS,
ENTITY_ALL_USERS_AND_GUESTS_NS,
ENTITY_ALL_USERS_AND_GUESTS_SUSP,
ENTITY_ALL_USERS_AND_GUESTS_NS_SUSP,
ENTITY_ALL_GUESTS,
ENTITY_ALL_GUESTS_NS,
ENTITY_ALL_GUESTS_SUSP,
ENTITY_ALL_GUESTS_NS_SUSP,
} }
DOMAIN_ENTITY_TYPES = { DOMAIN_ENTITY_TYPES = {
ENTITY_DOMAINS, ENTITY_DOMAINS,
@@ -534,13 +566,21 @@ class GamCLArgs():
} }
# #
ALL_USERS_QUERY_MAP = { ALL_USERS_QUERY_MAP = {
ENTITY_ALL_USERS: 'isSuspended=False', ENTITY_ALL_USERS: 'isSuspended=False isGuest=False',
ENTITY_ALL_USERS_NA: 'isArchived=False', ENTITY_ALL_USERS_NA: 'isArchived=False isGuest=False',
ENTITY_ALL_USERS_ARCH: 'isArchived=True', ENTITY_ALL_USERS_ARCH: 'isArchived=True isGuest=False',
ENTITY_ALL_USERS_NS: 'isSuspended=False', ENTITY_ALL_USERS_NS: 'isSuspended=False isGuest=False',
ENTITY_ALL_USERS_SUSP: 'isSuspended=True', ENTITY_ALL_USERS_SUSP: 'isSuspended=True isGuest=False',
ENTITY_ALL_USERS_NA_NS: 'isArchived=False isSuspended=False', ENTITY_ALL_USERS_NA_NS: 'isArchived=False isSuspended=False isGuest=False',
ENTITY_ALL_USERS_NS_SUSP: None, ENTITY_ALL_USERS_NS_SUSP: 'isGuest=False',
ENTITY_ALL_USERS_AND_GUESTS: 'isSuspended=False',
ENTITY_ALL_USERS_AND_GUESTS_NS: 'isSuspended=False',
ENTITY_ALL_USERS_AND_GUESTS_SUSP: 'isSuspended=True',
ENTITY_ALL_USERS_AND_GUESTS_NS_SUSP: None,
ENTITY_ALL_GUESTS: 'isSuspended=False isGuest=True',
ENTITY_ALL_GUESTS_NS: 'isSuspended=False isGuest=True',
ENTITY_ALL_GUESTS_SUSP: 'isSuspended=True isGuest=True',
ENTITY_ALL_GUESTS_NS_SUSP: 'isGuest=True',
} }
DOMAINS_QUERY_MAP = { DOMAINS_QUERY_MAP = {
ENTITY_DOMAINS: None, ENTITY_DOMAINS: None,
@@ -602,6 +642,14 @@ class GamCLArgs():
ENTITY_USERS_NA_NS: ENTITY_ALL_USERS_NA_NS, ENTITY_USERS_NA_NS: ENTITY_ALL_USERS_NA_NS,
ENTITY_USERS_ARCH_OR_SUSP: ENTITY_ALL_USERS_ARCH_OR_SUSP, ENTITY_USERS_ARCH_OR_SUSP: ENTITY_ALL_USERS_ARCH_OR_SUSP,
ENTITY_USERS_NS_SUSP: ENTITY_ALL_USERS_NS_SUSP, ENTITY_USERS_NS_SUSP: ENTITY_ALL_USERS_NS_SUSP,
ENTITY_USERS_AND_GUESTS: ENTITY_ALL_USERS_AND_GUESTS,
ENTITY_USERS_AND_GUESTS_NS: ENTITY_ALL_USERS_AND_GUESTS_NS,
ENTITY_USERS_AND_GUESTS_SUSP: ENTITY_ALL_USERS_AND_GUESTS_SUSP,
ENTITY_USERS_AND_GUESTS_NS_SUSP: ENTITY_ALL_USERS_AND_GUESTS_NS_SUSP,
ENTITY_GUESTS: ENTITY_ALL_GUESTS,
ENTITY_GUESTS_NS: ENTITY_ALL_GUESTS_NS,
ENTITY_GUESTS_SUSP: ENTITY_ALL_GUESTS_SUSP,
ENTITY_GUESTS_NS_SUSP: ENTITY_ALL_GUESTS_NS_SUSP,
} }
# Allowed values for CL source selector datafile, csvkmd # Allowed values for CL source selector datafile, csvkmd
CROS_ENTITY_SELECTOR_DATAFILE_CSVKMD_SUBTYPES = [ CROS_ENTITY_SELECTOR_DATAFILE_CSVKMD_SUBTYPES = [

View File

@@ -117,6 +117,8 @@ PROPERTIES = {
{CLASS: PC_STRING, TITLE: 'Full Name',}, {CLASS: PC_STRING, TITLE: 'Full Name',},
'displayName': 'displayName':
{CLASS: PC_STRING, TITLE: 'Display Name',}, {CLASS: PC_STRING, TITLE: 'Display Name',},
'primaryGuestEmail':
{CLASS: PC_STRING, TITLE: 'Primary Guest Email',},
'languages': 'languages':
{CLASS: PC_LANGUAGES, TITLE: 'Languages',}, {CLASS: PC_LANGUAGES, TITLE: 'Languages',},
'languageCode': 'languageCode':
@@ -131,6 +133,8 @@ PROPERTIES = {
{CLASS: PC_BOOLEAN, TITLE: 'Is a Super Admin',}, {CLASS: PC_BOOLEAN, TITLE: 'Is a Super Admin',},
'isDelegatedAdmin': 'isDelegatedAdmin':
{CLASS: PC_BOOLEAN, TITLE: 'Is Delegated Admin',}, {CLASS: PC_BOOLEAN, TITLE: 'Is Delegated Admin',},
'isGuestUser':
{CLASS: PC_BOOLEAN, TITLE: 'Is a Guest User',},
'isEnrolledIn2Sv': 'isEnrolledIn2Sv':
{CLASS: PC_BOOLEAN, TITLE: '2-step enrolled',}, {CLASS: PC_BOOLEAN, TITLE: '2-step enrolled',},
'isEnforcedIn2Sv': 'isEnforcedIn2Sv':