Skip to content

Commit ad8ac02

Browse files
committed
fix #305: okta connector integration, initial issues
This fixes: * the okta connector key was being reported as ignored when not used. * okta connector's `load_users_and_groups` didn't have the current full set of arguments. * clean up error messages for okta-produced errors * py2/py3 differences in the definition of `filter` led to uncaught errors in py3
1 parent 090a6ed commit ad8ac02

File tree

4 files changed

+29
-22
lines changed

4 files changed

+29
-22
lines changed

RELEASE_NOTES.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ There is a new command-line argument `--connector` for specifying whether to get
1010

1111
## Bug Fixes
1212

13-
None is this release candidate.
13+
[#305](https://github.com/adobe-apiplatform/user-sync.py/issues/305) General issues with Okta connector.
1414

1515
## Compatibility with Prior Versions
1616

user_sync/app.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ def create_config_loader_options(args):
238238
"""
239239
config_options = {
240240
'delete_strays': False,
241-
'directory_connector_type': None,
242241
'directory_connector_overridden_options': None,
242+
'directory_connector_type': None,
243243
'directory_group_filter': None,
244244
'directory_group_mapped': False,
245245
'disentitle_strays': False,
@@ -260,14 +260,14 @@ def create_config_loader_options(args):
260260
if args.connector_spec:
261261
raise AssertionException("Must not specify file (%s) with --connector %s" %
262262
(args.connector_spec[0], connector_type))
263-
config_options['directory_connector_type'] = connector_type
263+
config_options['directory_connector_type'] = connector_type
264264
elif connector_type == "csv":
265265
if len(args.connector_spec) != 1:
266266
raise AssertionException("Must specify a single file with CSV connector")
267267
config_options['directory_connector_type'] = 'csv'
268268
config_options['directory_connector_overridden_options'] = {'file_path': args.connector_spec.pop(0)}
269269
else:
270-
raise AssertionException("Unknown --connector type: %s" % connector_type)
270+
raise AssertionException("Unknown connector type: %s" % connector_type)
271271

272272
# --users
273273
users_args = args.users

user_sync/config.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ def __init__(self, caller_options):
4646
# these are in alphabetical order! Always add new ones that way!
4747
'delete_strays': False,
4848
'config_file_encoding': 'utf8',
49-
'directory_connector_module_name': None,
5049
'directory_connector_overridden_options': None,
50+
'directory_connector_type': None,
5151
'directory_group_filter': None,
5252
'directory_group_mapped': False,
5353
'disentitle_strays': False,
@@ -138,10 +138,11 @@ def get_directory_connector_configs(self):
138138
directory_config = self.main_config.get_dict_config('directory_users', True)
139139
if directory_config is not None:
140140
connectors_config = directory_config.get_dict_config('connectors', True)
141-
# make sure neither ldap nor csv connectors get reported as unused
141+
# make sure none of the standard connectors get reported as unused
142142
if connectors_config:
143143
connectors_config.get_list('ldap', True)
144144
connectors_config.get_list('csv', True)
145+
connectors_config.get_list('okta', True)
145146
return connectors_config
146147

147148
def get_directory_connector_options(self, connector_name):

user_sync/connector/directory_okta.py

+22-16
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020

2121
import okta
2222
import six
23+
from okta.framework.OktaError import OktaError
2324

2425
import user_sync.config
2526
import user_sync.connector.helper
26-
import user_sync.error
2727
import user_sync.helper
2828
import user_sync.identity_type
2929
from user_sync.error import AssertionException
@@ -44,15 +44,16 @@ def connector_initialize(options):
4444
return state
4545

4646

47-
def connector_load_users_and_groups(state, groups, extended_attributes):
47+
def connector_load_users_and_groups(state, groups, extended_attributes, all_users):
4848
"""
4949
:type state: OktaDirectoryConnector
5050
:type groups: list(str)
5151
:type extended_attributes: list(str)
52+
:type all_users: bool
5253
:rtype (bool, iterable(dict))
5354
"""
5455

55-
return state.load_users_and_groups(groups, extended_attributes)
56+
return state.load_users_and_groups(groups, extended_attributes, all_users)
5657

5758

5859
class OktaDirectoryConnector(object):
@@ -93,17 +94,20 @@ def __init__(self, caller_options):
9394
try:
9495
self.users_client = okta.UsersClient(host, api_token)
9596
self.groups_client = okta.UserGroupsClient(host, api_token)
96-
except Exception as e:
97-
raise user_sync.error.AssertionException(repr(e))
97+
except OktaError as e:
98+
raise AssertionException("Error connecting to Okta: %s" % e)
9899

99100
logger.info('Connected')
100101

101-
def load_users_and_groups(self, groups, extended_attributes):
102+
def load_users_and_groups(self, groups, extended_attributes, all_users):
102103
"""
103104
:type groups: list(str)
104105
:type extended_attributes: list(str)
106+
:type all_users: bool
105107
:rtype (bool, iterable(dict))
106108
"""
109+
if all_users:
110+
raise AssertionException("Okta connector has no notion of all users, please specify a --users group")
107111

108112
options = self.options
109113
all_users_filter = options['all_users_filter']
@@ -140,9 +144,9 @@ def find_group(self, group):
140144
group_filter_format = options['group_filter_format']
141145
try:
142146
results = self.groups_client.get_groups(query=group_filter_format.format(group=group))
143-
except Exception as e:
147+
except OktaError as e:
144148
self.logger.warning("Unable to query group")
145-
raise user_sync.error.AssertionException(repr(e))
149+
raise AssertionException("Okta error querying for group: %s" % e)
146150

147151
if results is None:
148152
self.logger.warning("No group found for: %s", group)
@@ -156,6 +160,7 @@ def find_group(self, group):
156160
def iter_group_members(self, group, filter_string, extended_attributes):
157161
"""
158162
:type group: str
163+
:type filter_string: str
159164
:type extended_attributes: list
160165
:rtype iterator(str, str)
161166
"""
@@ -169,9 +174,9 @@ def iter_group_members(self, group, filter_string, extended_attributes):
169174
try:
170175
attr_dict = OKTAValueFormatter.get_extended_attribute_dict(user_attribute_names)
171176
members = self.groups_client.get_group_all_users(res_group.id, attr_dict)
172-
except Exception as e:
177+
except OktaError as e:
173178
self.logger.warning("Unable to get_group_users")
174-
raise user_sync.error.AssertionException(repr(e))
179+
raise AssertionException("Okta error querying for group users: %s" % e)
175180
# Filtering users based all_users_filter query in config
176181
for member in self.filter_users(members, filter_string):
177182
profile = member.profile
@@ -201,7 +206,7 @@ def convert_user(self, record, extended_attributes):
201206
else:
202207
try:
203208
user['identity_type'] = user_sync.identity_type.parse_identity_type(user_identity_type)
204-
except user_sync.error.AssertionException as e:
209+
except AssertionException as e:
205210
self.logger.warning('Skipping user %s: %s', profile.login, e)
206211
return None
207212

@@ -250,17 +255,18 @@ def iter_search_result(self, filter_string, attributes):
250255
users = self.users_client.get_all_users(query=filter_string, extended_attribute=attr_dict)
251256
else:
252257
users = self.users_client.get_all_users(query=filter_string)
253-
except Exception as e:
258+
except OktaError as e:
254259
self.logger.warning("Unable to query users")
255-
raise user_sync.error.AssertionException(repr(e))
260+
raise AssertionException("Okta error querying for users: %s" % e)
256261
return users
257262

258263
def filter_users(self, users, filter_string):
259264
try:
260-
result = filter(lambda user: eval(filter_string), users)
265+
return list(filter(lambda user: eval(filter_string), users))
266+
except SyntaxError as e:
267+
raise AssertionException("Invalid syntax in predicate (%s): cannot evaluate" % filter_string)
261268
except Exception as e:
262-
raise AssertionException("Error filtering users: %s" % e)
263-
return result
269+
raise AssertionException("Error filtering with predicate (%s): %s" % (filter_string, e))
264270

265271

266272
class OKTAValueFormatter(object):

0 commit comments

Comments
 (0)