gcpdetails/scopes cleanup #1891
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 x86_64 macOS 26, macos-26-intel) (push) Has been cancelled
Build and test GAM / build (false, build, 12, Build Arm MacOS 26, macos-26) (push) Has been cancelled
Build and test GAM / build (false, build, 13, Build Intel Windows, windows-2025-vs2026) (push) Has been cancelled
Build and test GAM / build (false, build, 14, 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, 15, Test Python 3.10, ubuntu-24.04, 3.10) (push) Has been cancelled
Build and test GAM / build (false, test, 16, Test Python 3.11, ubuntu-24.04, 3.11) (push) Has been cancelled
Build and test GAM / build (false, test, 17, Test Python 3.12, ubuntu-24.04, 3.12) (push) Has been cancelled
Build and test GAM / build (false, test, 18, Test Python 3.13, ubuntu-24.04, 3.13) (push) Has been cancelled
Build and test GAM / build (false, test, 19, Test Python 3.15-dev, ubuntu-24.04, 3.15-dev) (push) Has been cancelled
Build and test GAM / build (true, test, 20, Test Python 3.14 freethread, ubuntu-24.04, 3.14) (push) Has been cancelled
Build and test GAM / publish (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Push wiki / pushwiki (push) Has been cancelled

This commit is contained in:
Ross Scroggs
2026-03-18 17:22:57 -07:00
parent ce47c9bc7c
commit 4137b3b77b
3 changed files with 37 additions and 27 deletions

View File

@@ -8914,17 +8914,17 @@ gam <UserTypeEntity> delete tokens clientid <ClientID>
gam <UserTypeEntity> print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>] gam <UserTypeEntity> print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>]
[usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)]
[delimiter <Character>] [delimiter <Character>] [gcpdetails]
gam <UserTypeEntity> show tokens|token|3lo|oauth [clientid <ClientID>] gam <UserTypeEntity> show tokens|token|3lo|oauth [clientid <ClientID>]
[usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)]
[delimiter <Character>] [delimiter <Character>] [gcpdetails]
gam print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>] gam print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>]
[usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)]
[delimiter <Character>] [delimiter <Character>] [gcpdetails]
[<UserTypeEntity>] [<UserTypeEntity>]
gam show tokens|token [clientid <ClientID>] gam show tokens|token [clientid <ClientID>]
[usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)]
[delimiter <Character>] [delimiter <Character>] [gcpdetails]
[<UserTypeEntity>] [<UserTypeEntity>]
# Users - YouTube # Users - YouTube

View File

@@ -1,3 +1,13 @@
7.37.00
Added new client access scopes used by `gam print tokens`.
```
[*] 52) Resource Manager - Organizations readonly
[*] 53) Resource Manager - Projects readonly
```
Added option `gcpdetails` to `gam print tokens` that uses these scopes to get additional project information.
7.36.03 7.36.03
Added command to send email replies that causes Gmail to recognize the message Added command to send email replies that causes Gmail to recognize the message

View File

@@ -11361,8 +11361,8 @@ def doOAuthCreate():
for scope in scopesList: for scope in scopesList:
subScopes = scope.get('subscopes', []) subScopes = scope.get('subscopes', [])
if ((uscope == scope['scope']) or if ((uscope == scope['scope']) or
(uscope.endswith('.action') and 'actiononly' in subscopes) or (uscope.endswith('.action') and 'actiononly' in subScopes) or
(uscope.endswith('.readonly') and 'readonly' in subscopes)): (uscope.endswith('.readonly') and 'readonly' in subScopes)):
scopes.append(uscope) scopes.append(uscope)
break break
else: else:
@@ -72447,10 +72447,13 @@ def _printShowTokens(entityType, users):
match = re.search(r'^\d+', client_id) match = re.search(r'^\d+', client_id)
return match.group() return match.group()
def get_gcp_info(): def get_gcp_info(results):
for result in results:
result['project'] = project_from_client_id(result.get('clientId'))
if result['project'] in internal_projects: if result['project'] in internal_projects:
result['internal'] = True result['internal'] = True
return continue
result['internal'] = False
try: try:
results = callGAPI(crm1.projects(), 'getAncestry', results = callGAPI(crm1.projects(), 'getAncestry',
throwReasons=[GAPI.PERMISSION_DENIED], throwReasons=[GAPI.PERMISSION_DENIED],
@@ -72458,7 +72461,7 @@ def _printShowTokens(entityType, users):
for ancestor in results.get('ancestor', []): for ancestor in results.get('ancestor', []):
if ancestor.get('resourceId', {}).get('type') == 'organization' and ancestor.get('resourceId', {}).get('id') == org_id: if ancestor.get('resourceId', {}).get('type') == 'organization' and ancestor.get('resourceId', {}).get('id') == org_id:
result['internal'] = True result['internal'] = True
internal_projects.append(result['project']) internal_projects.add(result['project'])
except GAPI.permissionDenied: except GAPI.permissionDenied:
# we don't have permission to get project. This might be an external project # we don't have permission to get project. This might be an external project
# or it might be an internal project we don't have rights to get. # or it might be an internal project we don't have rights to get.
@@ -72493,7 +72496,6 @@ def _printShowTokens(entityType, users):
elif myarg == 'gcpdetails': elif myarg == 'gcpdetails':
getGCPDetails = True getGCPDetails = True
extra_titles = ['project', 'internal'] extra_titles = ['project', 'internal']
gcp_projects = {}
elif not entityType: elif not entityType:
Cmd.Backup() Cmd.Backup()
entityType, users = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS) entityType, users = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
@@ -72514,7 +72516,7 @@ def _printShowTokens(entityType, users):
else: else:
tokenTitle = TOKENS_TITLE_MAP[aggregateUsersBy] tokenTitle = TOKENS_TITLE_MAP[aggregateUsersBy]
if getGCPDetails: if getGCPDetails:
internal_projects = [] # cache internal_projects = set() # cache
crm = buildGAPIObject('cloudresourcemanager') crm = buildGAPIObject('cloudresourcemanager')
crm1 = buildGAPIObject('cloudresourcemanagerv1') crm1 = buildGAPIObject('cloudresourcemanagerv1')
admin_email = _getAdminEmail() admin_email = _getAdminEmail()
@@ -72542,9 +72544,7 @@ def _printShowTokens(entityType, users):
GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED], GAPI.FORBIDDEN, GAPI.PERMISSION_DENIED],
userKey=user, fields=f'items({fields})') userKey=user, fields=f'items({fields})')
if getGCPDetails: if getGCPDetails:
for result in results: get_gcp_info(results)
result['project'] = project_from_client_id(result.get('clientId'))
get_gcp_info()
if not aggregateUsersBy: if not aggregateUsersBy:
if not csvPF: if not csvPF:
jcount = len(results) jcount = len(results)