def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options): """ Remove memberPrincipal values. This is done afterward because it isn't a DN and the LDAPAddMember method explicitly only handles DNs. See servicedelegation_add_member() for an explanation of what failedattr is. """ ldap = self.obj.backend failed[self.principal_failedattr] = {} failed[self.principal_failedattr][self.principal_attr] = [] names = options.get(self.member_names[self.principal_attr], []) if names: for name in names: if not name: continue name = normalize_principal(name) try: if name in entry_attrs.get(self.principal_attr, []): entry_attrs[self.principal_attr].remove(name) else: raise errors.NotGroupMember() except errors.PublicError as e: failed[self.principal_failedattr][ self.principal_attr].append((name, unicode(e))) else: completed += 1 try: ldap.update_entry(entry_attrs) except errors.EmptyModlist: pass return completed, dn
def post_callback(self, ldap, completed, failed, dn, entry_attrs, *keys, **options): """ Add memberPrincipal values. This is done afterward because it isn't a DN and the LDAPAddMember method explicitly only handles DNs. A separate fake attribute name is used for failed members. This is a reverse of the way this is typically handled in the *Member routines, where a successful addition will be represented as member/memberof_<attribute>. In this case, because memberPrincipal isn't a DN, I'm doing the reverse, and creating a fake failed attribute instead. """ ldap = self.obj.backend members = [] failed[self.principal_failedattr] = {} failed[self.principal_failedattr][self.principal_attr] = [] names = options.get(self.member_names[self.principal_attr], []) ldap_obj = self.api.Object['service'] if names: for name in names: if not name: continue name = normalize_principal(name) obj_dn = ldap_obj.get_dn(name) try: ldap.get_entry(obj_dn, ['krbprincipalname']) except errors.NotFound as e: failed[self.principal_failedattr][ self.principal_attr].append((name, unicode(e))) continue try: if name not in entry_attrs.get(self.principal_attr, []): members.append(name) else: raise errors.AlreadyGroupMember() except errors.PublicError as e: failed[self.principal_failedattr][ self.principal_attr].append((name, unicode(e))) else: completed += 1 if members: value = entry_attrs.setdefault(self.principal_attr, []) value.extend(members) try: ldap.update_entry(entry_attrs) except errors.EmptyModlist: pass return completed, dn
def _acl_make_request(principal_type, principal, ca_ref, profile_id): """Construct HBAC request for the given principal, CA and profile""" service, name, realm = split_any_principal(principal) req = pyhbac.HbacRequest() req.targethost.name = ca_ref req.service.name = profile_id if principal_type == 'user': req.user.name = principal elif principal_type == 'host': req.user.name = name elif principal_type == 'service': req.user.name = normalize_principal(principal) groups = [] if principal_type == 'user': user_obj = api.Command.user_show(principal)['result'] groups = user_obj.get('memberof_group', []) groups += user_obj.get('memberofindirect_group', []) elif principal_type == 'host': host_obj = api.Command.host_show(name)['result'] groups = host_obj.get('memberof_hostgroup', []) groups += host_obj.get('memberofindirect_hostgroup', []) req.user.groups = sorted(set(groups)) return req