Import Upstream version 4.12.4
This commit is contained in:
@@ -87,6 +87,11 @@ class AutomemberTracker(Tracker):
|
||||
return self.make_command('automember_add_condition', self.cn,
|
||||
*args, **kwargs)
|
||||
|
||||
def make_remove_condition_command(self, *args, **kwargs):
|
||||
""" Make function that issues automember_remove_condition """
|
||||
return self.make_command('automember_remove_condition', self.cn,
|
||||
*args, **kwargs)
|
||||
|
||||
def track_create(self):
|
||||
""" Updates expected state for automember creation"""
|
||||
self.attrs = dict(
|
||||
@@ -189,6 +194,17 @@ class AutomemberTracker(Tracker):
|
||||
result = command()
|
||||
self.check_add_condition(result)
|
||||
|
||||
def add_condition_exclusive(self, key, type, exclusiveregex):
|
||||
""" Add a condition with given exclusive regex and check for result.
|
||||
Only one condition can be added. For more specific uses please
|
||||
use make_add_condition_command instead. """
|
||||
command = self.make_add_condition_command(
|
||||
key=key, type=type, automemberexclusiveregex=exclusiveregex)
|
||||
self.attrs['automemberexclusiveregex'] = [u'%s=%s' %
|
||||
(key, exclusiveregex[0])]
|
||||
result = command()
|
||||
self.check_add_condition(result)
|
||||
|
||||
def rebuild(self, no_wait=False):
|
||||
""" Rebuild automember conditions and check for result """
|
||||
command = self.make_rebuild_command(type=self.membertype,
|
||||
|
||||
@@ -155,9 +155,7 @@ class ModificationTracker(BaseTracker):
|
||||
result = command()
|
||||
self.attrs.update(updates)
|
||||
self.attrs.update(expected_updates)
|
||||
for key, value in self.attrs.items():
|
||||
if value is None:
|
||||
del self.attrs[key]
|
||||
self.attrs = {k: v for k, v in self.attrs.items() if v is not None}
|
||||
|
||||
self.check_update(
|
||||
result,
|
||||
@@ -302,6 +300,11 @@ class EnableTracker(BaseTracker):
|
||||
(enabled/disabled) after the test as it was before it.
|
||||
"""
|
||||
def cleanup():
|
||||
if isinstance(self, CreationTracker):
|
||||
# special case: if it already got deleted there is
|
||||
# nothing to enable or disable
|
||||
return
|
||||
|
||||
if self.original_enabled != self.enabled:
|
||||
if self.original_enabled:
|
||||
command = self.make_enable_command()
|
||||
|
||||
@@ -6,7 +6,7 @@ from __future__ import absolute_import
|
||||
import six
|
||||
|
||||
from ipapython.dn import DN
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker, EnableTracker
|
||||
from ipatests.util import assert_deepequal
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import (
|
||||
fuzzy_issuer,
|
||||
@@ -22,11 +22,12 @@ if six.PY3:
|
||||
unicode = str
|
||||
|
||||
|
||||
class CATracker(Tracker):
|
||||
class CATracker(Tracker, EnableTracker):
|
||||
"""Implementation of a Tracker class for CA plugin."""
|
||||
|
||||
ldap_keys = {
|
||||
'dn', 'cn', 'ipacaid', 'ipacasubjectdn', 'ipacaissuerdn', 'description'
|
||||
'dn', 'cn', 'ipacaid', 'ipacasubjectdn', 'ipacaissuerdn',
|
||||
'description', 'ipacarandomserialnumberversion',
|
||||
}
|
||||
cert_keys = {
|
||||
'certificate',
|
||||
@@ -42,7 +43,7 @@ class CATracker(Tracker):
|
||||
update_keys = ldap_keys - {'dn'}
|
||||
|
||||
def __init__(self, name, subject, desc=u"Test generated CA",
|
||||
default_version=None):
|
||||
default_version=None, auto_disable_for_delete=True):
|
||||
super(CATracker, self).__init__(default_version=default_version)
|
||||
self.attrs = {}
|
||||
self.ipasubjectdn = subject
|
||||
@@ -52,6 +53,9 @@ class CATracker(Tracker):
|
||||
self.api.env.container_ca,
|
||||
self.api.env.basedn)
|
||||
|
||||
# Whether to run ca-disable automatically before deleting the CA.
|
||||
self.auto_disable_for_delete = auto_disable_for_delete
|
||||
|
||||
def make_create_command(self):
|
||||
"""Make function that creates the plugin entry object."""
|
||||
return self.make_command(
|
||||
@@ -78,11 +82,29 @@ class CATracker(Tracker):
|
||||
certificate_chain=fuzzy_sequence_of(fuzzy_bytes),
|
||||
objectclass=objectclasses.ca
|
||||
)
|
||||
if self.description == 'IPA CA':
|
||||
self.attrs['ipacarandomserialnumberversion'] = ('0',)
|
||||
self.exists = True
|
||||
|
||||
def make_disable_command(self):
|
||||
return self.make_command('ca_disable', self.name)
|
||||
|
||||
def check_disable(self, result):
|
||||
assert_deepequal(dict(
|
||||
result=True,
|
||||
value=self.name,
|
||||
summary=f'Disabled CA "{self.name}"',
|
||||
), result)
|
||||
|
||||
def make_delete_command(self):
|
||||
"""Make function that deletes the plugin entry object."""
|
||||
return self.make_command('ca_del', self.name)
|
||||
if self.auto_disable_for_delete:
|
||||
def disable_then_delete():
|
||||
self.make_command('ca_disable', self.name)()
|
||||
return self.make_command('ca_del', self.name)()
|
||||
return disable_then_delete
|
||||
else:
|
||||
return self.make_command('ca_del', self.name)
|
||||
|
||||
def check_delete(self, result):
|
||||
assert_deepequal(dict(
|
||||
|
||||
@@ -39,7 +39,7 @@ class CAACLTracker(Tracker):
|
||||
u'ipamemberca_ca'}
|
||||
category_keys = {
|
||||
u'ipacacategory', u'ipacertprofilecategory', u'usercategory',
|
||||
u'hostcategory', u'servicecategory', u'ipacacategory'}
|
||||
u'hostcategory', u'servicecategory'}
|
||||
retrieve_keys = {
|
||||
u'dn', u'cn', u'description', u'ipaenabledflag',
|
||||
u'ipamemberca', u'ipamembercertprofile', u'memberuser',
|
||||
@@ -49,7 +49,7 @@ class CAACLTracker(Tracker):
|
||||
u'usercategory', u'hostcategory', u'ipacacategory',
|
||||
u'servicecategory', u'ipaenabledflag', u'objectclass',
|
||||
u'ipauniqueid'}
|
||||
update_keys = create_keys - {u'dn'}
|
||||
update_keys = retrieve_keys - {"dn"}
|
||||
|
||||
def __init__(self, name, ipacertprofile_category=None, user_category=None,
|
||||
service_category=None, host_category=None,
|
||||
@@ -105,11 +105,11 @@ class CAACLTracker(Tracker):
|
||||
ipauniqueid=[fuzzy_uuid],
|
||||
cn=[self.name],
|
||||
objectclass=objectclasses.caacl,
|
||||
ipaenabledflag=[u'TRUE'])
|
||||
ipaenabledflag=[True])
|
||||
|
||||
self.attrs.update(self.create_categories)
|
||||
if self.description:
|
||||
self.attrs.update({u'description', [self.description]})
|
||||
self.attrs.update({"description": [self.description]})
|
||||
|
||||
self.exists = True
|
||||
|
||||
@@ -157,7 +157,7 @@ class CAACLTracker(Tracker):
|
||||
def make_update_command(self, updates):
|
||||
return self.make_command('caacl_mod', self.name, **updates)
|
||||
|
||||
def update(self, updates, expected_updates=None, silent=False):
|
||||
def update(self, updates, expected_updates=None):
|
||||
"""If removing a category, delete it from tracker as well"""
|
||||
# filter out empty categories and track changes
|
||||
|
||||
@@ -165,11 +165,7 @@ class CAACLTracker(Tracker):
|
||||
for key, value in updates.items():
|
||||
if key in self.category_keys:
|
||||
if not value:
|
||||
try:
|
||||
del self.attrs[key]
|
||||
except IndexError:
|
||||
if silent:
|
||||
pass
|
||||
del self.attrs[key]
|
||||
else:
|
||||
# if there is a value, prepare the pair for update
|
||||
filtered_updates.update({key: value})
|
||||
@@ -184,12 +180,13 @@ class CAACLTracker(Tracker):
|
||||
try:
|
||||
result = command()
|
||||
except errors.EmptyModlist:
|
||||
if silent:
|
||||
self.attrs.update(filtered_updates)
|
||||
self.attrs.update(expected_updates)
|
||||
self.check_update(result,
|
||||
extra_keys=set(self.update_keys) |
|
||||
set(expected_updates.keys()))
|
||||
pass
|
||||
else:
|
||||
self.attrs.update(filtered_updates)
|
||||
self.attrs.update(expected_updates)
|
||||
self.check_update(result,
|
||||
extra_keys=set(self.update_keys) |
|
||||
set(expected_updates.keys()))
|
||||
|
||||
def check_update(self, result, extra_keys=()):
|
||||
assert_deepequal(dict(
|
||||
@@ -374,10 +371,10 @@ class CAACLTracker(Tracker):
|
||||
|
||||
def enable(self):
|
||||
command = self.make_command(u'caacl_enable', self.name)
|
||||
self.attrs.update({u'ipaenabledflag': [u'TRUE']})
|
||||
self.attrs.update({u'ipaenabledflag': [True]})
|
||||
command()
|
||||
|
||||
def disable(self):
|
||||
command = self.make_command(u'caacl_disable', self.name)
|
||||
self.attrs.update({u'ipaenabledflag': [u'FALSE']})
|
||||
self.attrs.update({u'ipaenabledflag': [False]})
|
||||
command()
|
||||
|
||||
@@ -52,7 +52,7 @@ class CertmapruleTracker(Tracker, EnableTracker):
|
||||
self.attrs = {
|
||||
'dn': self.dn,
|
||||
'cn': [self.name],
|
||||
'ipaenabledflag': [u'TRUE'],
|
||||
'ipaenabledflag': [True],
|
||||
'objectclass': objectclasses.certmaprule,
|
||||
}
|
||||
self.attrs.update({
|
||||
|
||||
@@ -86,7 +86,7 @@ class CertprofileTracker(Tracker):
|
||||
dn=unicode(self.dn),
|
||||
cn=[self.name],
|
||||
description=[self.description],
|
||||
ipacertprofilestoreissued=[unicode(self.store).upper()],
|
||||
ipacertprofilestoreissued=[self.store],
|
||||
objectclass=objectclasses.certprofile
|
||||
)
|
||||
self.exists = True
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
from ipatests.test_xmlrpc import objectclasses
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_digits, fuzzy_uuid
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_user_or_group_sid
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_set_optional_oc
|
||||
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker
|
||||
from ipatests.util import assert_deepequal, get_group_dn
|
||||
@@ -21,9 +23,10 @@ class GroupTracker(Tracker):
|
||||
'idoverrideuser'
|
||||
}
|
||||
|
||||
retrieve_all_keys = retrieve_keys | {u'ipauniqueid', u'objectclass'}
|
||||
retrieve_all_keys = retrieve_keys | {u'ipauniqueid', u'objectclass',
|
||||
'ipantsecurityidentifier'}
|
||||
|
||||
create_keys = retrieve_all_keys
|
||||
create_keys = retrieve_all_keys - {u'ipantsecurityidentifier'}
|
||||
update_keys = retrieve_keys - {u'dn'}
|
||||
|
||||
add_member_keys = retrieve_keys | {u'description'}
|
||||
@@ -91,7 +94,9 @@ class GroupTracker(Tracker):
|
||||
description=[self.description],
|
||||
gidnumber=[fuzzy_digits],
|
||||
ipauniqueid=[fuzzy_uuid],
|
||||
objectclass=objectclasses.posixgroup,
|
||||
objectclass=fuzzy_set_optional_oc(
|
||||
objectclasses.posixgroup, 'ipantgroupattrs'),
|
||||
ipantsecurityidentifier=[fuzzy_user_or_group_sid],
|
||||
)
|
||||
self.exists = True
|
||||
|
||||
|
||||
170
ipatests/test_xmlrpc/tracker/idp_plugin.py
Normal file
170
ipatests/test_xmlrpc/tracker/idp_plugin.py
Normal file
@@ -0,0 +1,170 @@
|
||||
#
|
||||
# Copyright (C) 2021 FreeIPA Contributors see COPYING for license
|
||||
#
|
||||
|
||||
from ipalib import api
|
||||
from ipapython.dn import DN
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker
|
||||
from ipatests.test_xmlrpc import objectclasses
|
||||
from ipatests.util import assert_deepequal
|
||||
|
||||
|
||||
class IdpTracker(Tracker):
|
||||
"""Class for ipd tests"""
|
||||
|
||||
retrieve_keys = {
|
||||
'dn', 'cn', 'ipaidpauthendpoint', 'ipaidpdevauthendpoint',
|
||||
'ipaidpuserinfoendpoint', 'ipaidpkeysendpoint',
|
||||
'ipaidptokenendpoint', 'ipaidpissuerurl',
|
||||
'ipaidpclientid', 'ipaidpscope', 'ipaidpsub'}
|
||||
|
||||
retrieve_all_keys = retrieve_keys | {
|
||||
'objectclass', 'ipaidpclientsecret'
|
||||
}
|
||||
|
||||
create_keys = retrieve_all_keys
|
||||
|
||||
update_keys = retrieve_keys - {'dn'}
|
||||
|
||||
find_keys = retrieve_keys
|
||||
find_all_keys = retrieve_all_keys
|
||||
|
||||
primary_keys = {'cn', 'dn'}
|
||||
|
||||
def __init__(self, cn, **kwargs):
|
||||
super(IdpTracker, self).__init__(default_version=None)
|
||||
self.cn = cn
|
||||
self.dn = DN(('cn', cn), api.env.container_idp, api.env.basedn)
|
||||
self.kwargs = kwargs
|
||||
|
||||
def make_create_command(self):
|
||||
""" Make function that creates an idp using idp-add """
|
||||
return self.make_command('idp_add', self.cn, **self.kwargs)
|
||||
|
||||
def track_create(self):
|
||||
""" Update expected state for idp creation """
|
||||
self.attrs = dict(
|
||||
dn=self.dn,
|
||||
cn=[self.cn],
|
||||
objectclass=objectclasses.idp,
|
||||
)
|
||||
for key, value in self.kwargs.items():
|
||||
if key == 'ipaidpclientsecret':
|
||||
self.attrs[key] = [value.encode('utf-8')]
|
||||
continue
|
||||
if type(value) is not list:
|
||||
self.attrs[key] = [value]
|
||||
else:
|
||||
self.attrs[key] = value
|
||||
self.exists = True
|
||||
|
||||
def check_create(self, result, extra_keys=()):
|
||||
""" Check idp-add command result """
|
||||
expected = self.filter_attrs(self.create_keys | set(extra_keys))
|
||||
assert_deepequal(
|
||||
dict(
|
||||
value=self.cn,
|
||||
summary='Added Identity Provider reference "%s"' % self.cn,
|
||||
result=self.filter_attrs(expected),
|
||||
), result)
|
||||
|
||||
def make_delete_command(self):
|
||||
""" Make function that deletes an idp using idp-del """
|
||||
return self.make_command('idp_del', self.cn)
|
||||
|
||||
def check_delete(self, result):
|
||||
""" Check idp-del command result """
|
||||
assert_deepequal(
|
||||
dict(
|
||||
value=[self.cn],
|
||||
summary='Deleted Identity Provider reference "%s"' % self.cn,
|
||||
result=dict(failed=[]),
|
||||
), result)
|
||||
|
||||
def make_retrieve_command(self, all=False, raw=False):
|
||||
""" Make function that retrieves an idp using idp-show """
|
||||
return self.make_command('idp_show', self.cn, all=all)
|
||||
|
||||
def check_retrieve(self, result, all=False, raw=False):
|
||||
""" Check idp-show command result """
|
||||
if all:
|
||||
expected = self.filter_attrs(self.retrieve_all_keys)
|
||||
else:
|
||||
expected = self.filter_attrs(self.retrieve_keys)
|
||||
assert_deepequal(dict(
|
||||
value=self.cn,
|
||||
summary=None,
|
||||
result=expected,
|
||||
), result)
|
||||
|
||||
def make_find_command(self, *args, **kwargs):
|
||||
""" Make function that finds idp using idp-find """
|
||||
return self.make_command('idp_find', *args, **kwargs)
|
||||
|
||||
def check_find(self, result, all=False, raw=False, pkey_only=False):
|
||||
""" Check idp-find command result """
|
||||
if all:
|
||||
expected = self.filter_attrs(self.find_all_keys)
|
||||
elif pkey_only:
|
||||
expected = self.filter_attrs(self.primary_keys)
|
||||
else:
|
||||
expected = self.filter_attrs(self.find_keys)
|
||||
|
||||
assert_deepequal(dict(
|
||||
count=1,
|
||||
truncated=False,
|
||||
summary='1 Identity Provider reference matched',
|
||||
result=[expected],
|
||||
), result)
|
||||
|
||||
def make_update_command(self, updates):
|
||||
""" Make function that updates an idp using idp_mod """
|
||||
return self.make_command('idp_mod', self.cn, **updates)
|
||||
|
||||
def update(self, updates, expected_updates=None):
|
||||
"""Helper function to update this idp and check the result
|
||||
|
||||
Overriding Tracker method for setting self.attrs correctly;
|
||||
* most attributes stores its value in list
|
||||
* the rest can be overridden by expected_updates
|
||||
* allow deleting parameters if update value is None
|
||||
"""
|
||||
if expected_updates is None:
|
||||
expected_updates = {}
|
||||
|
||||
self.ensure_exists()
|
||||
command = self.make_update_command(updates)
|
||||
result = command()
|
||||
|
||||
for key, value in updates.items():
|
||||
if value is None or value == '':
|
||||
del self.attrs[key]
|
||||
elif key == 'rename':
|
||||
self.attrs['cn'] = [value]
|
||||
else:
|
||||
if type(value) is list:
|
||||
self.attrs[key] = value
|
||||
else:
|
||||
self.attrs[key] = [value]
|
||||
for key, value in expected_updates.items():
|
||||
if value is None or value == '':
|
||||
del self.attrs[key]
|
||||
else:
|
||||
self.attrs[key] = value
|
||||
|
||||
self.check_update(
|
||||
result,
|
||||
extra_keys=set(updates.keys()) | set(expected_updates.keys())
|
||||
)
|
||||
|
||||
if 'rename' in updates:
|
||||
self.cn = self.attrs['cn'][0]
|
||||
|
||||
def check_update(self, result, extra_keys=()):
|
||||
""" Check idp-mod command result """
|
||||
expected = self.filter_attrs(self.update_keys | set(extra_keys))
|
||||
assert_deepequal(dict(
|
||||
value=self.cn,
|
||||
summary='Modified Identity Provider reference "%s"' % self.cn,
|
||||
result=expected
|
||||
), result)
|
||||
126
ipatests/test_xmlrpc/tracker/passkey_plugin.py
Normal file
126
ipatests/test_xmlrpc/tracker/passkey_plugin.py
Normal file
@@ -0,0 +1,126 @@
|
||||
#
|
||||
# Copyright (C) 2022 FreeIPA Contributors see COPYING for license
|
||||
#
|
||||
|
||||
from ipapython.dn import DN
|
||||
from ipatests.test_xmlrpc import objectclasses
|
||||
from ipatests.test_xmlrpc.tracker.base import ConfigurationTracker
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import fuzzy_string
|
||||
from ipatests.util import assert_deepequal
|
||||
|
||||
|
||||
class PasskeyconfigTracker(ConfigurationTracker):
|
||||
retrieve_keys = {
|
||||
'dn',
|
||||
'iparequireuserverification',
|
||||
}
|
||||
|
||||
retrieve_all_keys = retrieve_keys | {
|
||||
'cn',
|
||||
'objectclass',
|
||||
'aci',
|
||||
}
|
||||
|
||||
update_keys = retrieve_keys - {'dn'}
|
||||
singlevalue_keys = {'iparequireuserverification'}
|
||||
|
||||
def __init__(self, default_version=None):
|
||||
super(PasskeyconfigTracker, self).__init__(
|
||||
default_version=default_version)
|
||||
|
||||
self.attrs = {
|
||||
'dn': DN(self.api.env.container_passkey, self.api.env.basedn),
|
||||
'cn': [self.api.env.container_passkey[0].value],
|
||||
'objectclass': objectclasses.passkeyconfig,
|
||||
'aci': [fuzzy_string],
|
||||
'iparequireuserverif': self.api.Command.passkeyconfig_show(
|
||||
)['result']['iparequireuserverification'],
|
||||
}
|
||||
|
||||
def make_update_command(self, updates):
|
||||
return self.make_command('passkeyconfig_mod', **updates)
|
||||
|
||||
def check_update(self, result, extra_keys=()):
|
||||
assert_deepequal(
|
||||
dict(
|
||||
value=None,
|
||||
summary=None,
|
||||
result=self.filter_attrs(self.update_keys | set(extra_keys)),
|
||||
),
|
||||
result
|
||||
)
|
||||
|
||||
def make_retrieve_command(self, all=False, raw=False):
|
||||
return self.make_command('passkeyconfig_show', all=all, raw=raw)
|
||||
|
||||
def check_retrieve(self, result, all=False, raw=False):
|
||||
if all:
|
||||
expected = self.filter_attrs(self.retrieve_all_keys)
|
||||
else:
|
||||
expected = self.filter_attrs(self.retrieve_keys)
|
||||
assert_deepequal(
|
||||
dict(
|
||||
value=None,
|
||||
summary=None,
|
||||
result=expected,
|
||||
),
|
||||
result
|
||||
)
|
||||
|
||||
|
||||
class PasskeyMixin:
|
||||
def _make_add_passkey(self):
|
||||
raise NotImplementedError("_make_add_passkey method must be "
|
||||
"implemented in instance.")
|
||||
|
||||
def _make_remove_passkey(self):
|
||||
raise NotImplementedError("_make_remove_passkey method must be "
|
||||
"implemented in instance.")
|
||||
|
||||
def add_passkey(self, **kwargs):
|
||||
cmd = self._make_add_passkey()
|
||||
result = cmd(**kwargs)
|
||||
data = kwargs.get('ipapasskey', [])
|
||||
if not isinstance(data, list):
|
||||
data = [data]
|
||||
self.attrs.setdefault('ipapasskey', []).extend(data)
|
||||
|
||||
expected = dict(
|
||||
summary=('Added passkey mappings to user '
|
||||
'"{}"'.format(self.name)),
|
||||
value=self.name,
|
||||
result=dict(
|
||||
uid=(self.name,),
|
||||
),
|
||||
)
|
||||
|
||||
if self.attrs['ipapasskey']:
|
||||
expected['result']['ipapasskey'] = (
|
||||
self.attrs['ipapasskey'])
|
||||
|
||||
assert_deepequal(expected, result)
|
||||
|
||||
def remove_passkey(self, **kwargs):
|
||||
cmd = self._make_remove_passkey()
|
||||
|
||||
result = cmd(**kwargs)
|
||||
data = kwargs.get('ipapasskey', [])
|
||||
if not isinstance(data, list):
|
||||
data = [data]
|
||||
|
||||
for key in data:
|
||||
self.attrs['ipapasskey'].remove(key)
|
||||
|
||||
expected = dict(
|
||||
summary=('Removed passkey mappings from user '
|
||||
'"{}"'.format(self.name)),
|
||||
value=self.name,
|
||||
result=dict(
|
||||
uid=(self.name,),
|
||||
),
|
||||
)
|
||||
if self.attrs['ipapasskey']:
|
||||
expected['result']['ipapasskey'] = (
|
||||
self.attrs['ipapasskey'])
|
||||
|
||||
assert_deepequal(expected, result)
|
||||
@@ -8,6 +8,7 @@ from ipalib import api, errors
|
||||
from ipaplatform.constants import constants as platformconstants
|
||||
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker
|
||||
from ipatests.test_xmlrpc.tracker.passkey_plugin import PasskeyMixin
|
||||
from ipatests.test_xmlrpc.tracker.kerberos_aliases import KerberosAliasMixin
|
||||
from ipatests.test_xmlrpc import objectclasses
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import (
|
||||
@@ -30,7 +31,7 @@ sshpubkeyfp = (u'SHA256:cStA9o5TRSARbeketEOooMUMSWRSsArIAXloBZ4vNsE '
|
||||
'public key test (ssh-rsa)')
|
||||
|
||||
|
||||
class StageUserTracker(KerberosAliasMixin, Tracker):
|
||||
class StageUserTracker(PasskeyMixin, KerberosAliasMixin, Tracker):
|
||||
""" Tracker class for staged user LDAP object
|
||||
|
||||
Implements helper functions for host plugin.
|
||||
@@ -147,7 +148,7 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
|
||||
loginshell=[platformconstants.DEFAULT_SHELL],
|
||||
has_keytab=False,
|
||||
has_password=False,
|
||||
nsaccountlock=[u'true'],
|
||||
nsaccountlock=True,
|
||||
)
|
||||
|
||||
for key in self.kwargs:
|
||||
@@ -201,14 +202,6 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
|
||||
else:
|
||||
expected = self.filter_attrs(self.retrieve_keys)
|
||||
|
||||
# small override because stageuser-find returns different
|
||||
# type of nsaccountlock value than DS, but overall the value
|
||||
# fits expected result
|
||||
if expected[u'nsaccountlock'] == [u'true']:
|
||||
expected[u'nsaccountlock'] = True
|
||||
elif expected[u'nsaccountlock'] == [u'false']:
|
||||
expected[u'nsaccountlock'] = False
|
||||
|
||||
assert_deepequal(dict(
|
||||
value=self.uid,
|
||||
summary=None,
|
||||
@@ -222,14 +215,6 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
|
||||
else:
|
||||
expected = self.filter_attrs(self.find_keys)
|
||||
|
||||
# small override because stageuser-find returns different
|
||||
# type of nsaccountlock value than DS, but overall the value
|
||||
# fits expected result
|
||||
if expected[u'nsaccountlock'] == [u'true']:
|
||||
expected[u'nsaccountlock'] = True
|
||||
elif expected[u'nsaccountlock'] == [u'false']:
|
||||
expected[u'nsaccountlock'] = False
|
||||
|
||||
assert_deepequal(dict(
|
||||
count=1,
|
||||
truncated=False,
|
||||
@@ -301,3 +286,10 @@ class StageUserTracker(KerberosAliasMixin, Tracker):
|
||||
|
||||
def _make_remove_alias_cmd(self):
|
||||
return self.make_command('stageuser_remove_principal', self.name)
|
||||
|
||||
# Passkey mapping methods
|
||||
def _make_add_passkey(self):
|
||||
return self.make_command('stageuser_add_passkey', self.name)
|
||||
|
||||
def _make_remove_passkey(self):
|
||||
return self.make_command('stageuser_remove_passkey', self.name)
|
||||
|
||||
@@ -11,16 +11,19 @@ import six
|
||||
from ipatests.util import assert_deepequal, get_group_dn
|
||||
from ipatests.test_xmlrpc import objectclasses
|
||||
from ipatests.test_xmlrpc.xmlrpc_test import (
|
||||
fuzzy_digits, fuzzy_uuid, raises_exact)
|
||||
fuzzy_set_optional_oc,
|
||||
fuzzy_digits, fuzzy_uuid, fuzzy_user_or_group_sid, raises_exact)
|
||||
from ipatests.test_xmlrpc.tracker.base import Tracker
|
||||
from ipatests.test_xmlrpc.tracker.kerberos_aliases import KerberosAliasMixin
|
||||
from ipatests.test_xmlrpc.tracker.certmapdata import CertmapdataMixin
|
||||
from ipatests.test_xmlrpc.tracker.passkey_plugin import PasskeyMixin
|
||||
|
||||
if six.PY3:
|
||||
unicode = str
|
||||
|
||||
|
||||
class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
class UserTracker(PasskeyMixin, CertmapdataMixin, KerberosAliasMixin,
|
||||
Tracker):
|
||||
""" Class for host plugin like tests """
|
||||
|
||||
retrieve_keys = {
|
||||
@@ -40,7 +43,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
u'l', u'mobile', u'krbextradata', u'krblastpwdchange',
|
||||
u'krbpasswordexpiration', u'pager', u'st', u'manager', u'cn',
|
||||
u'ipauniqueid', u'objectclass', u'mepmanagedentry',
|
||||
u'displayname', u'gecos', u'initials', u'preserved'}
|
||||
u'displayname', u'gecos', u'initials', u'preserved',
|
||||
'ipantsecurityidentifier'}
|
||||
|
||||
retrieve_preserved_keys = (retrieve_keys - {u'memberof_group'}) | {
|
||||
u'preserved'}
|
||||
@@ -50,6 +54,7 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
u'krbextradata', u'krbpasswordexpiration', u'krblastpwdchange',
|
||||
u'krbprincipalkey', u'userpassword', u'randompassword'}
|
||||
create_keys = create_keys - {u'nsaccountlock'}
|
||||
create_keys = create_keys - {'ipantsecurityidentifier'}
|
||||
|
||||
update_keys = retrieve_keys - {u'dn'}
|
||||
activate_keys = retrieve_keys
|
||||
@@ -122,7 +127,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
api.env.container_deleteuser,
|
||||
api.env.basedn
|
||||
)
|
||||
self.attrs[u'objectclass'] = objectclasses.user_base
|
||||
self.attrs[u'objectclass'] = objectclasses.user_base \
|
||||
+ ['ipantuserattrs']
|
||||
|
||||
return self.make_command(
|
||||
'user_del', self.uid,
|
||||
@@ -173,7 +179,8 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
displayname=[u'%s %s' % (self.givenname, self.sn)],
|
||||
cn=[u'%s %s' % (self.givenname, self.sn)],
|
||||
initials=[u'%s%s' % (self.givenname[0], self.sn[0])],
|
||||
objectclass=objectclasses.user,
|
||||
objectclass=fuzzy_set_optional_oc(
|
||||
objectclasses.user, 'ipantuserattrs'),
|
||||
description=[u'__no_upg__'],
|
||||
ipauniqueid=[fuzzy_uuid],
|
||||
uidnumber=[fuzzy_digits],
|
||||
@@ -188,26 +195,29 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
mepmanagedentry=[get_group_dn(self.uid)],
|
||||
memberof_group=[u'ipausers'],
|
||||
nsaccountlock=[u'false'],
|
||||
ipantsecurityidentifier=[fuzzy_user_or_group_sid],
|
||||
)
|
||||
|
||||
for key in self.kwargs:
|
||||
if key == u'krbprincipalname':
|
||||
for key, value in self.kwargs.items():
|
||||
if key == "krbprincipalname":
|
||||
try:
|
||||
self.attrs[key] = [u'%s@%s' % (
|
||||
(self.kwargs[key].split('@'))[0].lower(),
|
||||
(self.kwargs[key].split('@'))[1]
|
||||
)]
|
||||
princ_splitted = value.split("@", maxsplit=1)
|
||||
self.attrs[key] = [
|
||||
"{}@{}".format(
|
||||
princ_splitted[0].lower(),
|
||||
princ_splitted[1],
|
||||
)
|
||||
]
|
||||
except IndexError:
|
||||
# we can provide just principal part
|
||||
self.attrs[key] = [u'%s@%s' % (
|
||||
(self.kwargs[key].lower(),
|
||||
self.api.env.realm)
|
||||
)]
|
||||
self.attrs[key] = [
|
||||
"{}@{}".format(value.lower(), self.api.env.realm)
|
||||
]
|
||||
else:
|
||||
if type(self.kwargs[key]) is not list:
|
||||
self.attrs[key] = [self.kwargs[key]]
|
||||
if not isinstance(value, list):
|
||||
self.attrs[key] = [value]
|
||||
else:
|
||||
self.attrs[key] = self.kwargs[key]
|
||||
self.attrs[key] = value
|
||||
|
||||
self.exists = True
|
||||
|
||||
@@ -265,9 +275,14 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
|
||||
def check_delete(self, result):
|
||||
""" Check 'user-del' command result """
|
||||
if u'preserved' in self.attrs and self.attrs[u'preserved']:
|
||||
summary = u'Preserved user "%s"' % self.uid
|
||||
else:
|
||||
summary = u'Deleted user "%s"' % self.uid
|
||||
|
||||
assert_deepequal(dict(
|
||||
value=[self.uid],
|
||||
summary=u'Deleted user "%s"' % self.uid,
|
||||
summary=summary,
|
||||
result=dict(failed=[]),
|
||||
), result)
|
||||
|
||||
@@ -299,7 +314,7 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
result=expected,
|
||||
), result)
|
||||
|
||||
def check_find(self, result, all=False, pkey_only=False, raw=False,
|
||||
def check_find(self, result, all=False, raw=False, pkey_only=False,
|
||||
expected_override=None):
|
||||
""" Check 'user-find' command result """
|
||||
if all:
|
||||
@@ -540,3 +555,10 @@ class UserTracker(CertmapdataMixin, KerberosAliasMixin, Tracker):
|
||||
|
||||
def _make_remove_certmap(self):
|
||||
return self.make_command('user_remove_certmapdata', self.name)
|
||||
|
||||
# Passkey mapping methods
|
||||
def _make_add_passkey(self):
|
||||
return self.make_command('user_add_passkey', self.name)
|
||||
|
||||
def _make_remove_passkey(self):
|
||||
return self.make_command('user_remove_passkey', self.name)
|
||||
|
||||
Reference in New Issue
Block a user