mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
ipalib: introduce Principal parameter
This patch introduces a separate Principal parameter that allows the framework to syntactically validate incoming/outcoming principals by using a single shared codebase. https://fedorahosted.org/freeipa/ticket/3864 Reviewed-By: David Kupka <dkupka@redhat.com> Reviewed-By: Jan Cholasta <jcholast@redhat.com>
This commit is contained in:
parent
e6fc8f84d3
commit
974eb7b5ef
@ -31,6 +31,7 @@ if six.PY3:
|
|||||||
_TYPES = {
|
_TYPES = {
|
||||||
'DN': DN,
|
'DN': DN,
|
||||||
'DNSName': DNSName,
|
'DNSName': DNSName,
|
||||||
|
'Principal': unicode,
|
||||||
'NoneType': type(None),
|
'NoneType': type(None),
|
||||||
'Sequence': collections.Sequence,
|
'Sequence': collections.Sequence,
|
||||||
'bool': bool,
|
'bool': bool,
|
||||||
@ -45,6 +46,7 @@ _PARAMS = {
|
|||||||
'Decimal': parameters.Decimal,
|
'Decimal': parameters.Decimal,
|
||||||
'DN': parameters.DNParam,
|
'DN': parameters.DNParam,
|
||||||
'DNSName': parameters.DNSNameParam,
|
'DNSName': parameters.DNSNameParam,
|
||||||
|
'Principal': parameters.Principal,
|
||||||
'bool': parameters.Bool,
|
'bool': parameters.Bool,
|
||||||
'bytes': parameters.Bytes,
|
'bytes': parameters.Bytes,
|
||||||
'datetime': parameters.DateTime,
|
'datetime': parameters.DateTime,
|
||||||
|
@ -115,9 +115,11 @@ from ipalib.errors import PasswordMismatch, Base64DecodeError
|
|||||||
from ipalib.constants import TYPE_ERROR, CALLABLE_ERROR, LDAP_GENERALIZED_TIME_FORMAT
|
from ipalib.constants import TYPE_ERROR, CALLABLE_ERROR, LDAP_GENERALIZED_TIME_FORMAT
|
||||||
from ipalib.text import Gettext, FixMe
|
from ipalib.text import Gettext, FixMe
|
||||||
from ipalib.util import json_serialize, validate_idna_domain
|
from ipalib.util import json_serialize, validate_idna_domain
|
||||||
|
from ipapython import kerberos
|
||||||
from ipapython.dn import DN
|
from ipapython.dn import DN
|
||||||
from ipapython.dnsutil import DNSName
|
from ipapython.dnsutil import DNSName
|
||||||
|
|
||||||
|
|
||||||
def _is_null(value):
|
def _is_null(value):
|
||||||
return not value and value != 0 # NOTE: False == 0
|
return not value and value != 0 # NOTE: False == 0
|
||||||
|
|
||||||
@ -1970,3 +1972,38 @@ class Dict(Param):
|
|||||||
|
|
||||||
type = dict
|
type = dict
|
||||||
type_error = _("must be dictionary")
|
type_error = _("must be dictionary")
|
||||||
|
|
||||||
|
|
||||||
|
class Principal(Param):
|
||||||
|
"""
|
||||||
|
Kerberos principal name
|
||||||
|
"""
|
||||||
|
|
||||||
|
type = kerberos.Principal
|
||||||
|
type_error = _('must be Kerberos principal')
|
||||||
|
kwargs = Param.kwargs + (
|
||||||
|
('require_service', bool, False),
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def allowed_types(self):
|
||||||
|
return (self.type, unicode)
|
||||||
|
|
||||||
|
def _convert_scalar(self, value, index=None):
|
||||||
|
if isinstance(value, unicode):
|
||||||
|
try:
|
||||||
|
value = kerberos.Principal(value)
|
||||||
|
except ValueError:
|
||||||
|
raise ConversionError(
|
||||||
|
name=self.get_param_name(),
|
||||||
|
error=_("Malformed principal: '%(value)s'") % dict(
|
||||||
|
value=value))
|
||||||
|
|
||||||
|
return super(Principal, self)._convert_scalar(value)
|
||||||
|
|
||||||
|
def _rule_require_service(self, _, value):
|
||||||
|
if self.require_service and not value.is_service:
|
||||||
|
raise ValidationError(
|
||||||
|
name=self.get_param_name(),
|
||||||
|
error=_("Service principal is required")
|
||||||
|
)
|
||||||
|
@ -66,6 +66,7 @@ from ipalib.krb_utils import KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN, KRB5KRB_AP_ERR_TKT
|
|||||||
KRB5_FCC_PERM, KRB5_FCC_NOFILE, KRB5_CC_FORMAT, \
|
KRB5_FCC_PERM, KRB5_FCC_NOFILE, KRB5_CC_FORMAT, \
|
||||||
KRB5_REALM_CANT_RESOLVE, KRB5_CC_NOTFOUND, get_principal
|
KRB5_REALM_CANT_RESOLVE, KRB5_CC_NOTFOUND, get_principal
|
||||||
from ipapython.dn import DN
|
from ipapython.dn import DN
|
||||||
|
from ipapython.kerberos import Principal
|
||||||
from ipalib.capabilities import VERSION_WITHOUT_CAPABILITIES
|
from ipalib.capabilities import VERSION_WITHOUT_CAPABILITIES
|
||||||
from ipalib import api
|
from ipalib import api
|
||||||
|
|
||||||
@ -194,6 +195,9 @@ def xml_wrap(value, version):
|
|||||||
else:
|
else:
|
||||||
return unicode(value)
|
return unicode(value)
|
||||||
|
|
||||||
|
if isinstance(value, Principal):
|
||||||
|
return unicode(value)
|
||||||
|
|
||||||
assert type(value) in (unicode, float, bool, type(None)) + six.integer_types
|
assert type(value) in (unicode, float, bool, type(None)) + six.integer_types
|
||||||
return value
|
return value
|
||||||
|
|
||||||
@ -316,6 +320,8 @@ def json_encode_binary(val, version):
|
|||||||
return {'__dns_name__': unicode(val)}
|
return {'__dns_name__': unicode(val)}
|
||||||
else:
|
else:
|
||||||
return unicode(val)
|
return unicode(val)
|
||||||
|
elif isinstance(val, Principal):
|
||||||
|
return unicode(val)
|
||||||
else:
|
else:
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ from ipapython.ipautil import (
|
|||||||
from ipapython.ipa_log_manager import log_mgr
|
from ipapython.ipa_log_manager import log_mgr
|
||||||
from ipapython.dn import DN
|
from ipapython.dn import DN
|
||||||
from ipapython.dnsutil import DNSName
|
from ipapython.dnsutil import DNSName
|
||||||
|
from ipapython.kerberos import Principal
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
unicode = str
|
unicode = str
|
||||||
@ -686,6 +687,8 @@ class LDAPClient(object):
|
|||||||
'idnssoamname': DNSName,
|
'idnssoamname': DNSName,
|
||||||
'idnssoarname': DNSName,
|
'idnssoarname': DNSName,
|
||||||
'dnszoneidnsname': DNSName,
|
'dnszoneidnsname': DNSName,
|
||||||
|
'krbcanonicalname': Principal,
|
||||||
|
'krbprincipalname': Principal,
|
||||||
'nsds5replicalastupdatestart': unicode,
|
'nsds5replicalastupdatestart': unicode,
|
||||||
'nsds5replicalastupdateend': unicode,
|
'nsds5replicalastupdateend': unicode,
|
||||||
'nsds5replicalastinitstart': unicode,
|
'nsds5replicalastinitstart': unicode,
|
||||||
@ -847,7 +850,8 @@ class LDAPClient(object):
|
|||||||
return 'TRUE'
|
return 'TRUE'
|
||||||
else:
|
else:
|
||||||
return 'FALSE'
|
return 'FALSE'
|
||||||
elif isinstance(val, (unicode, six.integer_types, Decimal, DN)):
|
elif isinstance(val, (unicode, six.integer_types, Decimal, DN,
|
||||||
|
Principal)):
|
||||||
return value_to_utf8(val)
|
return value_to_utf8(val)
|
||||||
elif isinstance(val, DNSName):
|
elif isinstance(val, DNSName):
|
||||||
return val.to_text()
|
return val.to_text()
|
||||||
|
1
makeapi
1
makeapi
@ -71,6 +71,7 @@ PARAM_IGNORED_KW_ATTRIBUTES = (
|
|||||||
'pattern_errmsg',
|
'pattern_errmsg',
|
||||||
'precision',
|
'precision',
|
||||||
'primary_key',
|
'primary_key',
|
||||||
|
'require_service',
|
||||||
'query',
|
'query',
|
||||||
'sortorder',
|
'sortorder',
|
||||||
)
|
)
|
||||||
|
@ -186,6 +186,9 @@ ipa_class_members = {
|
|||||||
'only_absolute',
|
'only_absolute',
|
||||||
'only_relative',
|
'only_relative',
|
||||||
],
|
],
|
||||||
|
'ipalib.parameters.Principal': [
|
||||||
|
'require_service',
|
||||||
|
],
|
||||||
'ipalib.plugable.API': [
|
'ipalib.plugable.API': [
|
||||||
fake_api_env,
|
fake_api_env,
|
||||||
] + NAMESPACE_ATTRS + LOGGING_ATTRS,
|
] + NAMESPACE_ATTRS + LOGGING_ATTRS,
|
||||||
|
Loading…
Reference in New Issue
Block a user