processors/directory.py (111 lines of code) (raw):
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from .base import Processor, NotConfiguredException
from googleapiclient import discovery
from google.oauth2.credentials import Credentials
class DirectoryProcessor(Processor):
def get_default_config_key():
return 'directory'
def process(self, output_var='results'):
directory_config = self.config
if 'api' not in directory_config and directory_config['api'] in [
'groups', 'users', 'members', 'groupsettings'
]:
raise NotConfiguredException(
'No correct Directory API configured (supported: groups, groupsettings, users, members)!'
)
if directory_config[
'api'] == 'groupsettings' and 'groupUniqueIds' not in directory_config:
raise NotConfiguredException(
'No groupUniqueIds defined for group settings!')
if directory_config[
'api'] == 'members' and 'groupKey' not in directory_config:
raise NotConfiguredException(
'No groupKey defined for members listing!')
service_account = directory_config[
'serviceAccountEmail'] if 'serviceAccountEmail' in directory_config else None
scope = None
if directory_config['api'] in ['groups', 'members']:
scope = 'https://www.googleapis.com/auth/admin.directory.group.readonly'
if directory_config['api'] == 'groupsettings':
scope = 'https://www.googleapis.com/auth/apps.groups.settings'
if directory_config['api'] == 'users':
scope = 'https://www.googleapis.com/auth/admin.directory.user.readonly'
credentials = Credentials(
self.get_token_for_scopes([scope], service_account=service_account))
branded_http = self._get_branded_http(credentials)
if directory_config['api'] != 'groupsettings':
directory_service = discovery.build('admin',
'directory_v1',
http=branded_http)
else:
groups_service = discovery.build('groupssettings',
'v1',
http=branded_http)
query = directory_config['query'] if 'query' in directory_config else ''
query_template = self.jinja_environment.from_string(query)
query_template.name = 'query'
query_output = query_template.render()
results = []
page_token = None
groups = []
group_unique_id = None
if directory_config['api'] == 'groupsettings':
groups = self._jinja_var_to_list(directory_config['groupUniqueIds'],
'groupUniqueId')
group_unique_id = groups.pop()
while True:
query_parameters = {'maxResults': 200}
for k in [
'orderBy', 'sortOrder', 'maxResults', 'projection',
'showDeleted', 'viewType', 'customFieldMask', 'roles'
]:
if k in directory_config:
var_template = self.jinja_environment.from_string(
directory_config[k])
var_template.name = k
var_output = var_template.render()
query_parameters[k] = var_output
if page_token is not None:
query_parameters['page_token'] = page_token
if directory_config['api'] in ['groups', 'users']:
if query_output != '':
query_parameters['query'] = query_output
if 'customerId' in directory_config:
query_parameters['customer'] = directory_config[
'customerId']
elif 'domain' in directory_config:
query_parameters['domain'] = directory_config['domain']
if directory_config['api'] == 'groups':
request = directory_service.groups().list(**query_parameters)
elif directory_config['api'] == 'users':
request = directory_service.users().list(**query_parameters)
elif directory_config['api'] == 'groupsettings':
request = groups_service.groups().get(
groupUniqueId=group_unique_id)
elif directory_config['api'] == 'members':
groupkey_template = self.jinja_environment.from_string(
directory_config['groupKey'])
groupkey_template.name = 'groupKey'
groupkey_output = groupkey_template.render()
query_parameters['groupKey'] = groupkey_output
request = directory_service.members().list(**query_parameters)
response = request.execute()
if 'groups' in response:
results = results + response['groups']
if 'members' in response:
results = results + response['members']
if 'users' in response:
results = results + response['users']
if 'kind' in response and response[
'kind'] == 'groupsSettings#groups':
results.append(response)
if directory_config['api'] != 'groupsettings':
if 'nextPageToken' in response:
page_token = response['nextPageToken']
else:
break
else:
if len(groups) == 0:
break
group_unique_id = groups.pop()
res = {output_var: results}
return res