Add group iteration and syncing support to Keystone auth
This commit is contained in:
		
							parent
							
								
									47278cc559
								
							
						
					
					
						commit
						d7825c6720
					
				
					 6 changed files with 148 additions and 15 deletions
				
			
		|  | @ -5,6 +5,7 @@ from keystoneclient.v2_0 import client as kclient | |||
| from keystoneclient.v3 import client as kv3client | ||||
| from keystoneclient.exceptions import AuthorizationFailure as KeystoneAuthorizationFailure | ||||
| from keystoneclient.exceptions import Unauthorized as KeystoneUnauthorized | ||||
| from keystoneclient.exceptions import NotFound as KeystoneNotFound | ||||
| from data.users.federated import FederatedUsers, UserInformation | ||||
| from util.itertoolrecipes import take | ||||
| 
 | ||||
|  | @ -83,6 +84,11 @@ class KeystoneV3Users(FederatedUsers): | |||
|     self.debug = os.environ.get('USERS_DEBUG') == '1' | ||||
|     self.requires_email = requires_email | ||||
| 
 | ||||
|   def _get_admin_client(self): | ||||
|     return kv3client.Client(username=self.admin_username, password=self.admin_password, | ||||
|                             tenant_name=self.admin_tenant, auth_url=self.auth_url, | ||||
|                             timeout=self.timeout, debug=self.debug) | ||||
| 
 | ||||
|   def verify_credentials(self, username_or_email, password): | ||||
|     try: | ||||
|       keystone_client = kv3client.Client(username=username_or_email, password=password, | ||||
|  | @ -116,6 +122,46 @@ class KeystoneV3Users(FederatedUsers): | |||
| 
 | ||||
|     return (user, None) | ||||
| 
 | ||||
|   def check_group_lookup_args(self, group_lookup_args): | ||||
|     if not group_lookup_args.get('group_id'): | ||||
|       return (False, 'Missing group_id') | ||||
| 
 | ||||
|     group_id = group_lookup_args['group_id'] | ||||
|     return self._check_group(group_id) | ||||
| 
 | ||||
|   def _check_group(self, group_id): | ||||
|     try: | ||||
|       return (bool(self._get_admin_client().groups.get(group_id)), None) | ||||
|     except KeystoneNotFound: | ||||
|       return (False, 'Group not found') | ||||
|     except KeystoneAuthorizationFailure as kaf: | ||||
|       logger.exception('Keystone auth failure for admin user for group lookup %s', group_id) | ||||
|       return (False, kaf.message or 'Invalid admin username or password') | ||||
|     except KeystoneUnauthorized as kut: | ||||
|       logger.exception('Keystone unauthorized for admin user for group lookup %s', group_id) | ||||
|       return (False, kut.message or 'Invalid admin username or password') | ||||
| 
 | ||||
|   def iterate_group_members(self, group_lookup_args, page_size=None, disable_pagination=False): | ||||
|     group_id = group_lookup_args['group_id'] | ||||
| 
 | ||||
|     (status, err) = self._check_group(group_id) | ||||
|     if not status: | ||||
|       return (None, err) | ||||
| 
 | ||||
|     try: | ||||
|       group_member_iterator = self._get_admin_client().users.list(group=group_id) | ||||
|       def iterator(): | ||||
|         for user in group_member_iterator: | ||||
|           yield (self._user_info(user), None) | ||||
| 
 | ||||
|       return (iterator(), None) | ||||
|     except KeystoneAuthorizationFailure as kaf: | ||||
|       logger.exception('Keystone auth failure for admin user for group lookup %s', group_id) | ||||
|       return (False, kaf.message or 'Invalid admin username or password') | ||||
|     except KeystoneUnauthorized as kut: | ||||
|       logger.exception('Keystone unauthorized for admin user for group lookup %s', group_id) | ||||
|       return (False, kut.message or 'Invalid admin username or password') | ||||
| 
 | ||||
|   @staticmethod | ||||
|   def _user_info(user): | ||||
|     email = user.email if hasattr(user, 'email') else None | ||||
|  | @ -126,10 +172,7 @@ class KeystoneV3Users(FederatedUsers): | |||
|       return ([], self.federated_service, None) | ||||
| 
 | ||||
|     try: | ||||
|       keystone_client = kv3client.Client(username=self.admin_username, password=self.admin_password, | ||||
|                                          tenant_name=self.admin_tenant, auth_url=self.auth_url, | ||||
|                                          timeout=self.timeout, debug=self.debug) | ||||
|       found_users = list(take(limit, keystone_client.users.list(name=query))) | ||||
|       found_users = list(take(limit, self._get_admin_client().users.list(name=query))) | ||||
|       logger.debug('For Keystone query %s found users: %s', query, found_users) | ||||
|       if not found_users: | ||||
|         return ([], self.federated_service, None) | ||||
|  |  | |||
		Reference in a new issue