Chat admin cleanup

This commit is contained in:
Ross Scroggs
2024-06-04 18:04:15 -07:00
parent 82585dc28a
commit cb00e6de9f
6 changed files with 4845 additions and 72 deletions

View File

@@ -5972,8 +5972,7 @@ gam <UserTypeEntity> update chatspace <ChatSpace>
[description <String>] [guidelines|rules <String>]
[history <Boolean>])
[formatjson]
gam <UserTypeEntity> delete chatspace <ChatSpace>
[adminaccess|asadmin]
gam <UserTypeEntity> delete chatspace [adminaccess|asadmin] <ChatSpace>
gam <UserTypeEntity> info chatspace <ChatSpace>
[formatjson]
@@ -5985,20 +5984,24 @@ gam <UserTypeEntity> show chatspaces
gam <UserTypeEntity> print chatspaces [todrive <ToDriveAttribute>*]
[types <ChatSpaceTypeList>]
[formatjson [quotechar <Character>]]
[adminaccess|asadmin]
gam [<UserTypeEntity>] show chatspaces adminaccess|asadmin
[query <String>] [querytime<String> <Time>]
[orderby <ChatSpaceAdminOrderByFieldName> [ascending|descending]]
[formatjson]
gam [<UserTypeEntity>] print chatspaces adminaccess|asadmin [todrive <ToDriveAttribute>*]
[query <String>] [querytime<String> <Time>]
[orderby <ChatSpaceAdminOrderByFieldName> [ascending|descending]]
[formatjson [quotechar <Character>]]
gam <UserTypeEntity> create chatmember <ChatSpace>
gam <UserTypeEntity> create chatmember [adminaccess|asadmin] <ChatSpace>
[type human|bot] [role member|manager]
(user <UserItem>)* (members <UserTypeEntity>)*
(group <GroupItem>)* (groups <GroupEntity>)*
[formatjson|returnidonly]
[adminaccess|asadmin]
gam <UserTypeEntity> delete chatmember <ChatSpace>
gam <UserTypeEntity> delete chatmember [adminaccess|asadmin] <ChatSpace>
((user <UserItem>)|(members <UserTypeEntity>)|
(group <GroupItem>)|(groups <GroupEntity>))+
[adminaccess|asadmin]
gam <UserTypeEntity> remove chatmember members <ChatMemberList>
[adminaccess|asadmin]
gam <UserTypeEntity> remove chatmember [adminaccess|asadmin] members <ChatMemberList>
gam <UserTypeEntity> update chatmember <ChatSpace>
role member|manager
((user <UserItem>)|(members <UserTypeEntity>))+
@@ -6008,14 +6011,12 @@ gam <UserTypeEntity> modify chatmember
gam <UserTypeEntity> info chatmember members <ChatMemberList>
[formatjson]
gam <UserTypeEntity> show chatmembers <ChatSpace>
gam <UserTypeEntity> show chatmembers [adminaccess|asadmin] <ChatSpace>
[showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
[formatjson]
[adminaccess|asadmin]
gam <UserTypeEntity> print chatmembers [todrive <ToDriveAttribute>*] <ChatSpace>
gam <UserTypeEntity> print chatmembers [adminaccess|asadmin] [todrive <ToDriveAttribute>*] <ChatSpace>
[showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
[formatjson [quotechar <Character>]]
[adminaccess|asadmin]
gam <UserTypeEntity> create chatmessage <ChatSpace>
<ChatContent>

View File

@@ -2,6 +2,19 @@
Merged GAM-Team version
6.77.00
Added option `asadmin` to the following Chat commands that allows admin access.
These commands are in Developer Preview, your project must have Developer Preview enabled for the Chat API
in order to use these commands.
```
gam <UserTypeEntity> delete chatspace asadmin
gam <UserTypeEntity> print|show chatspaces asadmin
gam <UserTypeEntity> create chatmember asadmin
gam <UserTypeEntity> delete|remove chatmember asadmin
gam <UserTypeEntity> print|show chatmembers|asadmin
```
6.76.12
Fixed bug in `gam <UserTypeEntity> print|show chatspaces` that caused the following error:

4755
src/chat-v1.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,10 +10,11 @@ from gam.gamlib.glverlibs import GAM_VER_LIBS
datas = []
for pkg in GAM_VER_LIBS:
datas += copy_metadata(pkg, recursive=True)
datas += [('admin-directory_v1.1beta1.json', '.')]
datas += [('cbcm-v1.1beta1.json', '.')]
datas += [('chat-v1.json', '.')]
datas += [('contactdelegation-v1.json', '.')]
datas += [('admin-directory_v1.1beta1.json', '.')]
datas += [('datastudio-v1.json', '.')]
datas += [('cacerts.pem', '.')]
hiddenimports = [
'gam.auth.yubikey',

View File

@@ -25159,6 +25159,11 @@ def exitIfChatNotConfigured(chat, kvList, errMsg, i, count):
systemErrorExit(API_ACCESS_DENIED_RC, Msg.TO_SET_UP_GOOGLE_CHAT.format(setupChatURL(chat)))
entityActionFailedWarning(kvList, errMsg, i, count)
def _getChatAdminAccess(adminAPI, userAPI):
if checkArgumentPresent(ADMIN_ACCESS_OPTIONS):
return (True, adminAPI)
return (None, userAPI)
def _cleanChatSpace(space):
space.pop('type', None)
space.pop('threaded', None)
@@ -25410,19 +25415,14 @@ def updateChatSpace(users):
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
# gam <UserTypeEntity> delete chatspace <ChatSpace>
# [adminaccess|asadmin]
# gam <UserTypeEntity> delete chatspace [adminaccess|asadmin] <ChatSpace>
def deleteChatSpace(users):
name = None
useAdminAccess = None
api = API.CHAT_SPACES_DELETE
useAdminAccess, api = _getChatAdminAccess(API.CHAT_SPACES_DELETE_ADMIN, API.CHAT_SPACES_DELETE)
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
name = getChatSpace(myarg)
elif myarg in ADMIN_ACCESS_OPTIONS:
useAdminAccess = True
api = API.CHAT_ADMIN_DELETE
else:
unknownArgumentExit()
if not name:
@@ -25504,27 +25504,27 @@ CHAT_SPACES_ADMIN_ORDERBY_CHOICE_MAP = {
# [types <ChatSpaceTypeList>]
# [formatjson [quotechar <Character>]]
# gam [<UserTypeEntity>] show chatspaces adminaccess|asadmin
# [query <String>]]
# [query <String>] [querytime<String> <Time>]
# [orderby <ChatSpaceAdminOrderByFieldName> [ascending|descending]]
# [formatjson]
# gam [<UserTypeEntity>] print chatspaces adminaccess|asadmin [todrive <ToDriveAttribute>*]
# [query <String>]]
# [query <String>] [querytime<String> <Time>]
# [orderby <ChatSpaceAdminOrderByFieldName> [ascending|descending]]
# [formatjson [quotechar <Character>]]
def printShowChatSpaces(users):
csvPF = CSVPrintFile(['User', 'name'] if not isinstance(users, list) else ['name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
useAdminAccess = checkArgumentPresent(ADMIN_ACCESS_OPTIONS)
OBY = OrderBy(CHAT_SPACES_ADMIN_ORDERBY_CHOICE_MAP)
useAdminAccess, api = _getChatAdminAccess(API.CHAT_SPACES_ADMIN, API.CHAT_SPACES)
queries = []
queryTimes = {}
pfilter = ''
kwargs = {}
if useAdminAccess:
api = API.CHAT_SPACES_ADMIN
function = 'search'
kwargs['useAdminAccess'] = True
kwargs['query'] = 'customer = "customers/my_customer" AND spaceType = "SPACE"'
queries = ['customer = "customers/my_customer" AND spaceType = "SPACE"']
else:
api = API.CHAT_SPACES
function = 'list'
while Cmd.ArgumentsRemaining():
myarg = getArgument()
@@ -25541,7 +25541,9 @@ def printShowChatSpaces(users):
elif useAdminAccess and myarg == 'orderby':
OBY.GetChoice()
elif useAdminAccess and myarg == 'query':
kwargs['query'] += ' AND '+ getString(Cmd.OB_QUERY)
queries[0] += ' AND '+getString(Cmd.OB_QUERY)
elif useAdminAccess and myarg.startswith('querytime'):
queryTimes[myarg] = getTimeOrDeltaFromNow()
else:
FJQC.GetFormatJSONQuoteChar(myarg, True)
if not useAdminAccess:
@@ -25549,6 +25551,8 @@ def printShowChatSpaces(users):
kwargs['filter'] = pfilter
else:
kwargs['orderBy'] = OBY.orderBy
substituteQueryTimes(queries, queryTimes)
kwargs['query'] = queries[0]
i, count, users = getEntityArgument(users)
for user in users:
i += 1
@@ -25596,11 +25600,11 @@ def _getChatMemberEmail(cd, member):
_, memberUid = member['groupMember']['name'].split('/')
member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, emailTypes=['group'])
# gam <UserTypeEntity> create chatmember <ChatSpace>
# gam <UserTypeEntity> create chatmember [adminaccess|asadmin] <ChatSpace>
# [type human|bot] [role member|manager]
# (user <UserItem>)* (members <UserTypeEntity>)*
# (group <GroupItem>)* (groups <GroupEntity>)*
# [adminaccess|asadmin] [formatjson|returnidonly]
# [formatjson|returnidonly]
def createChatMember(users):
def addMembers(members, field, entityType, i, count):
jcount = len(members)
@@ -25621,7 +25625,6 @@ def createChatMember(users):
parent=parent, body=body)
if role != 'ROLE_MEMBER' and entityType == Ent.CHAT_MANAGER_USER:
member = callGAPI(chat.spaces().members(), 'patch',
useAdminAccess=useAdminAccess,
bailOnInternalError=True,
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED, GAPI.INTERNAL_ERROR],
name=member['name'], updateMask='role', body={'role': role})
@@ -25647,8 +25650,7 @@ def createChatMember(users):
userList = []
groupList = []
returnIdOnly = False
useAdminAccess = None
api = API.CHAT_MEMBERSHIPS
useAdminAccess, api = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS)
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
@@ -25668,9 +25670,6 @@ def createChatMember(users):
mtype = getChoice(CHAT_MEMBER_TYPE_MAP, mapChoice=True)
elif myarg == 'returnidonly':
returnIdOnly = True
elif myarg in ADMIN_ACCESS_OPTIONS:
useAdminAccess = True
api = API.CHAT_MEMBERSHIPS_ADMIN
else:
FJQC.GetFormatJSON(myarg)
if not parent:
@@ -25716,11 +25715,11 @@ def _deleteChatMembers(chat, kvList, jcount, memberNames, i, count, useAdminAcce
except (GAPI.invalidArgument, GAPI.permissionDenied, GAPI.internalError) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
# gam <UserTypeEntity> delete chatmember <ChatSpace>
# gam <UserTypeEntity> delete chatmember [adminaccess|asadmin] <ChatSpace>
# ((user <UserItem>)|(members <UserTypeEntity>)|
# (group <GroupItem>)|(groups <GroupEntity>))+
# [adminaccess|asadmin]
# gam <UserTypeEntity> remove chatmember members <ChatMemberList>
# gam <UserTypeEntity> remove chatmember [adminaccess|asadmin]
# members <ChatMemberList>
# gam <UserTypeEntity> update chatmember <ChatSpace>
# role member|manager
# ((user <UserItem>)|(members <UserTypeEntity>))+
@@ -25736,8 +25735,11 @@ def deleteUpdateChatMember(users):
body = {}
memberNames = []
userGroupList = []
useAdminAccess = None
api = API.CHAT_MEMBERSHIPS
if deleteMode:
useAdminAccess, api = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS)
else:
useAdminAccess = None
api = API.CHAT_MEMBERSHIPS
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if action in {Act.UPDATE, Act.MODIFY} and myarg == 'role':
@@ -25760,9 +25762,6 @@ def deleteUpdateChatMember(users):
userGroupList.append(getEmailAddress(returnUIDprefix='uid:'))
elif deleteMode and myarg == 'groups':
userGroupList.extend(getEntityList(Cmd.OB_GROUP_ENTITY))
elif myarg in ADMIN_ACCESS_OPTIONS:
useAdminAccess = True
api = API.CHAT_MEMBERSHIPS_ADMIN
else:
unknownArgumentExit()
if not deleteMode and 'role' not in body:
@@ -26011,20 +26010,20 @@ def infoChatMember(users):
def doInfoChatMember():
infoChatMember([None])
# gam [<UserTypeEntity>] show chatmembers <ChatSpace>
# gam [<UserTypeEntity>] show chatmembers [adminaccess|asadmin] <ChatSpace>
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
# [formatjson] [adminaccess|asadmin]
# gam [<UserTypeEntity>] print chatmembers [todrive <ToDriveAttribute>*] <ChatSpace>
# [formatjson]
# gam [<UserTypeEntity>] print chatmembers [adminaccess|asadmin] [todrive <ToDriveAttribute>*] <ChatSpace>
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
# [formatjson [quotechar <Character>]] [adminaccess|asadmin]
# [formatjson [quotechar <Character>]]
def printShowChatMembers(users):
cd = buildGAPIObject(API.DIRECTORY)
csvPF = CSVPrintFile(['User', 'space.name', 'name'] if not isinstance(users, list) else ['space.name', 'name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
pfilter = ''
kwargs = {}
parent = None
api = API.CHAT_MEMBERSHIPS
useAdminAccess = None
useAdminAccess, api = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS)
while Cmd.ArgumentsRemaining():
myarg = getArgument()
if csvPF and myarg == 'todrive':
@@ -26036,18 +26035,22 @@ def printShowChatMembers(users):
elif myarg == 'showgroups':
kwargs['showGroups'] = getBoolean()
elif myarg =='filter':
kwargs['filter'] = getString(Cmd.OB_STRING)
elif myarg in ADMIN_ACCESS_OPTIONS:
useAdminAccess = True
api = API.CHAT_MEMBERSHIPS_ADMIN
pfilter = getString(Cmd.OB_STRING)
else:
FJQC.GetFormatJSONQuoteChar(myarg, True)
if not parent:
missingArgumentExit('space')
if useAdminAccess and 'filter' in kwargs:
invalidArgumentExit('asadmin not compatible with filter')
elif useAdminAccess:
kwargs['filter'] = 'member.type != "BOT'
if useAdminAccess:
if pfilter:
if 'member.type' not in pfilter:
kwargs['filter'] = 'member.type != "BOT" AND '+pfilter
else:
kwargs['filter'] = pfilter
else:
kwargs['filter'] = 'member.type != "BOT"'
else:
if pfilter:
kwargs['filter'] = pfilter
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
if 'filter' in kwargs:
qfilter += f', {kwargs["filter"]}'

View File

@@ -33,8 +33,8 @@ CHAT_MEMBERSHIPS_ADMIN = 'chatmembershipsadmin'
CHAT_MESSAGES = 'chatmessages'
CHAT_SPACES = 'chatspaces'
CHAT_SPACES_ADMIN = 'chatspacesadmin'
CHAT_ADMIN_DELETE = 'chatadmindelete'
CHAT_SPACES_DELETE = 'chatspacesdelete'
CHAT_SPACES_DELETE_ADMIN = 'chatspacesdeleteadmin'
CHROMEMANAGEMENT = 'chromemanagement'
CHROMEMANAGEMENT_APPDETAILS = 'chromemanagementappdetails'
CHROMEMANAGEMENT_TELEMETRY = 'chromemanagementtelemetry'
@@ -198,14 +198,14 @@ _INFO = {
CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
CHAT_ADMIN_DELETE: {'name': 'Chat API - Admin Delete', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Admin Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_MESSAGES: {'name': 'Chat API - Messages', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_SPACES: {'name': 'Chat API - Spaces', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_SPACES_ADMIN: {'name': 'Chat API - Admin Spaces', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_SPACES_DELETE: {'name': 'Chat API - Spaces Delete', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT, 'localjson': True},
CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Memberships Admin', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_MESSAGES: {'name': 'Chat API - Messages', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_SPACES: {'name': 'Chat API - Spaces', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_SPACES_ADMIN: {'name': 'Chat API - Spaces Admin', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_SPACES_DELETE: {'name': 'Chat API - Spaces Delete', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CHAT_SPACES_DELETE_ADMIN: {'name': 'Chat API - Spaces Delete Admin', 'version': 'v1', 'v2discovery': True, 'localjson': True, 'mappedAPI': CHAT},
CLASSROOM: {'name': 'Classroom API', 'version': 'v1', 'v2discovery': True},
CHROMEMANAGEMENT: {'name': 'Chrome Management API', 'version': 'v1', 'v2discovery': True},
CHROMEMANAGEMENT_APPDETAILS: {'name': 'Chrome Management API - AppDetails', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHROMEMANAGEMENT},
@@ -520,10 +520,10 @@ _SVCACCT_SCOPES = [
'api': CHAT_MEMBERSHIPS,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/chat.memberships'},
{'name': 'Chat API - Admin Memberships',
{'name': 'Chat API - Memberships Admin',
'api': CHAT_MEMBERSHIPS_ADMIN,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/chat.admin.memberships'},
'scope': 'https://www.googleapis.com/auth/chat.admin.memberships'},
{'name': 'Chat API - Messages',
'api': CHAT_MESSAGES,
'subscopes': READONLY,
@@ -532,7 +532,7 @@ _SVCACCT_SCOPES = [
'api': CHAT_SPACES,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/chat.spaces'},
{'name': 'Chat API - Admin Spaces',
{'name': 'Chat API - Spaces Admin',
'api': CHAT_SPACES_ADMIN,
'subscopes': READONLY,
'scope': 'https://www.googleapis.com/auth/chat.admin.spaces'},
@@ -540,8 +540,8 @@ _SVCACCT_SCOPES = [
'api': CHAT_SPACES_DELETE,
'subscopes': [],
'scope': 'https://www.googleapis.com/auth/chat.delete'},
{'name': 'Chat API - Admin Delete',
'api': CHAT_ADMIN_DELETE,
{'name': 'Chat API - Spaces Delete Admin',
'api': CHAT_SPACES_DELETE_ADMIN,
'subscopes': [],
'scope': 'https://www.googleapis.com/auth/chat.admin.delete'},
{'name': 'Classroom API - Course Announcements',