ipapython 4.10.2__py2.py3-none-any.whl → 4.12.2__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ipapython/certdb.py +11 -9
- ipapython/cookie.py +1 -1
- ipapython/directivesetter.py +4 -1
- ipapython/ipaldap.py +28 -8
- ipapython/ipautil.py +40 -29
- ipapython/session_storage.py +19 -19
- ipapython/version.py +12 -5
- {ipapython-4.10.2.dist-info → ipapython-4.12.2.dist-info}/METADATA +7 -7
- {ipapython-4.10.2.dist-info → ipapython-4.12.2.dist-info}/RECORD +12 -12
- {ipapython-4.10.2.dist-info → ipapython-4.12.2.dist-info}/WHEEL +1 -1
- {ipapython-4.10.2.dist-info → ipapython-4.12.2.dist-info}/COPYING +0 -0
- {ipapython-4.10.2.dist-info → ipapython-4.12.2.dist-info}/top_level.txt +0 -0
ipapython/certdb.py
CHANGED
|
@@ -511,7 +511,8 @@ class NSSDatabase:
|
|
|
511
511
|
|
|
512
512
|
:return: List of (name, trust_flags) tuples
|
|
513
513
|
"""
|
|
514
|
-
|
|
514
|
+
args = ["-L"]
|
|
515
|
+
result = self.run_certutil(args, capture_output=True)
|
|
515
516
|
certs = result.output.splitlines()
|
|
516
517
|
|
|
517
518
|
# FIXME, this relies on NSS never changing the formatting of certutil
|
|
@@ -943,20 +944,21 @@ class NSSDatabase:
|
|
|
943
944
|
def _verify_cert_validity(self, cert):
|
|
944
945
|
"""Common checks for cert validity
|
|
945
946
|
"""
|
|
946
|
-
utcnow = datetime.datetime.
|
|
947
|
-
if cert.
|
|
947
|
+
utcnow = datetime.datetime.now(tz=datetime.timezone.utc)
|
|
948
|
+
if cert.not_valid_before_utc > utcnow:
|
|
948
949
|
raise ValueError(
|
|
949
|
-
f"not valid before {cert.
|
|
950
|
-
"future."
|
|
950
|
+
f"not valid before {cert.not_valid_before_utc} UTC is in "
|
|
951
|
+
"the future."
|
|
951
952
|
)
|
|
952
|
-
if cert.
|
|
953
|
+
if cert.not_valid_after_utc < utcnow:
|
|
953
954
|
raise ValueError(
|
|
954
|
-
f"has expired {cert.
|
|
955
|
+
f"has expired {cert.not_valid_after_utc} UTC"
|
|
955
956
|
)
|
|
956
957
|
# make sure the cert does not expire during installation
|
|
957
|
-
if cert.
|
|
958
|
+
if cert.not_valid_after_utc + datetime.timedelta(hours=1) < utcnow:
|
|
958
959
|
raise ValueError(
|
|
959
|
-
f"expires in less than one hour ({cert.
|
|
960
|
+
f"expires in less than one hour ({cert.not_valid_after_utc} "
|
|
961
|
+
"UTC)"
|
|
960
962
|
)
|
|
961
963
|
|
|
962
964
|
def verify_server_cert_validity(self, nickname, hostname):
|
ipapython/cookie.py
CHANGED
|
@@ -652,7 +652,7 @@ class Cookie:
|
|
|
652
652
|
|
|
653
653
|
cookie_expiration = self.get_expiration()
|
|
654
654
|
if cookie_expiration is not None:
|
|
655
|
-
now = datetime.datetime.
|
|
655
|
+
now = datetime.datetime.now(tz=datetime.timezone.utc)
|
|
656
656
|
if cookie_expiration < now:
|
|
657
657
|
raise Cookie.Expired("cookie named '%s'; expired at %s'" % \
|
|
658
658
|
(cookie_name,
|
ipapython/directivesetter.py
CHANGED
|
@@ -182,6 +182,9 @@ def get_directive(filename, directive, separator=' '):
|
|
|
182
182
|
if separator == ' ':
|
|
183
183
|
separator = '[ \t]+'
|
|
184
184
|
|
|
185
|
+
if directive is None:
|
|
186
|
+
return None
|
|
187
|
+
|
|
185
188
|
result = None
|
|
186
189
|
with open(filename, "r") as fd:
|
|
187
190
|
for line in fd:
|
|
@@ -193,7 +196,7 @@ def get_directive(filename, directive, separator=' '):
|
|
|
193
196
|
if match:
|
|
194
197
|
value = match.group(1)
|
|
195
198
|
else:
|
|
196
|
-
|
|
199
|
+
continue
|
|
197
200
|
|
|
198
201
|
result = unquote_directive_value(value.strip(), '"')
|
|
199
202
|
result = result.strip(' ')
|
ipapython/ipaldap.py
CHANGED
|
@@ -23,7 +23,7 @@ import binascii
|
|
|
23
23
|
import errno
|
|
24
24
|
import logging
|
|
25
25
|
import time
|
|
26
|
-
import datetime
|
|
26
|
+
from datetime import datetime
|
|
27
27
|
from decimal import Decimal
|
|
28
28
|
from copy import deepcopy
|
|
29
29
|
import contextlib
|
|
@@ -689,11 +689,12 @@ class LDAPClient:
|
|
|
689
689
|
'1.3.6.1.4.1.1466.115.121.1.10' : bytes, # Certificate Pair
|
|
690
690
|
'1.3.6.1.4.1.1466.115.121.1.12' : DN, # Distinguished Name
|
|
691
691
|
'1.3.6.1.4.1.1466.115.121.1.23' : bytes, # Fax
|
|
692
|
-
'1.3.6.1.4.1.1466.115.121.1.24' : datetime
|
|
692
|
+
'1.3.6.1.4.1.1466.115.121.1.24' : datetime, # GeneralizedTime
|
|
693
693
|
'1.3.6.1.4.1.1466.115.121.1.28' : bytes, # JPEG
|
|
694
694
|
'1.3.6.1.4.1.1466.115.121.1.40' : bytes, # OctetString (same as Binary)
|
|
695
695
|
'1.3.6.1.4.1.1466.115.121.1.49' : bytes, # Supported Algorithm
|
|
696
696
|
'1.3.6.1.4.1.1466.115.121.1.51' : bytes, # Teletext Terminal Identifier
|
|
697
|
+
'1.3.6.1.4.1.5322.21.2.5' : datetime, # krbLastAdminUnlock
|
|
697
698
|
|
|
698
699
|
'2.16.840.1.113730.3.8.3.3' : DN, # enrolledBy
|
|
699
700
|
'2.16.840.1.113730.3.8.3.18' : DN, # managedBy
|
|
@@ -706,16 +707,23 @@ class LDAPClient:
|
|
|
706
707
|
'2.16.840.1.113730.3.8.7.1' : DN, # memberAllowCmd
|
|
707
708
|
'2.16.840.1.113730.3.8.7.2' : DN, # memberDenyCmd
|
|
708
709
|
|
|
710
|
+
'2.16.840.1.113719.1.301.4.6.1' : datetime, # krbPrincipalExpiration
|
|
709
711
|
'2.16.840.1.113719.1.301.4.14.1' : DN, # krbRealmReferences
|
|
710
712
|
'2.16.840.1.113719.1.301.4.17.1' : DN, # krbKdcServers
|
|
711
713
|
'2.16.840.1.113719.1.301.4.18.1' : DN, # krbPwdServers
|
|
712
714
|
'2.16.840.1.113719.1.301.4.26.1' : DN, # krbPrincipalReferences
|
|
713
715
|
'2.16.840.1.113719.1.301.4.29.1' : DN, # krbAdmServers
|
|
714
716
|
'2.16.840.1.113719.1.301.4.36.1' : DN, # krbPwdPolicyReference
|
|
717
|
+
'2.16.840.1.113719.1.301.4.37.1' : datetime, # krbPasswordExpiration
|
|
715
718
|
'2.16.840.1.113719.1.301.4.40.1' : DN, # krbTicketPolicyReference
|
|
716
719
|
'2.16.840.1.113719.1.301.4.41.1' : DN, # krbSubTrees
|
|
720
|
+
'2.16.840.1.113719.1.301.4.45.1' : datetime, # krbLastPwdChange
|
|
721
|
+
'2.16.840.1.113719.1.301.4.48.1' : datetime, # krbLastSuccessfulAuth
|
|
722
|
+
'2.16.840.1.113719.1.301.4.49.1' : datetime, # krbLastFailedAuth
|
|
717
723
|
'2.16.840.1.113719.1.301.4.52.1' : DN, # krbObjectReferences
|
|
718
724
|
'2.16.840.1.113719.1.301.4.53.1' : DN, # krbPrincContainerRef
|
|
725
|
+
'2.16.840.1.113730.3.8.16.1.3' : datetime, # ipatokenNotBefore
|
|
726
|
+
'2.16.840.1.113730.3.8.16.1.4' : datetime, # ipatokenNotAfter
|
|
719
727
|
}
|
|
720
728
|
|
|
721
729
|
# In most cases we lookup the syntax from the schema returned by
|
|
@@ -990,7 +998,7 @@ class LDAPClient:
|
|
|
990
998
|
# key in dict must be str not bytes
|
|
991
999
|
dct = dict((k, self.encode(v)) for k, v in val.items())
|
|
992
1000
|
return dct
|
|
993
|
-
elif isinstance(val, datetime
|
|
1001
|
+
elif isinstance(val, datetime):
|
|
994
1002
|
return val.strftime(LDAP_GENERALIZED_TIME_FORMAT).encode('utf-8')
|
|
995
1003
|
elif isinstance(val, crypto_x509.Certificate):
|
|
996
1004
|
return val.public_bytes(x509.Encoding.DER)
|
|
@@ -1012,8 +1020,8 @@ class LDAPClient:
|
|
|
1012
1020
|
return val.decode('utf-8')
|
|
1013
1021
|
elif target_type is bool:
|
|
1014
1022
|
return val.decode('utf-8') == 'TRUE'
|
|
1015
|
-
elif target_type is datetime
|
|
1016
|
-
return datetime.
|
|
1023
|
+
elif target_type is datetime:
|
|
1024
|
+
return datetime.strptime(
|
|
1017
1025
|
val.decode('utf-8'), LDAP_GENERALIZED_TIME_FORMAT)
|
|
1018
1026
|
elif target_type is DNSName:
|
|
1019
1027
|
return DNSName.from_text(val.decode('utf-8'))
|
|
@@ -1177,14 +1185,23 @@ class LDAPClient:
|
|
|
1177
1185
|
"""schema associated with this LDAP server"""
|
|
1178
1186
|
return self._get_schema()
|
|
1179
1187
|
|
|
1180
|
-
def get_allowed_attributes(self, objectclasses, raise_on_unknown=False
|
|
1188
|
+
def get_allowed_attributes(self, objectclasses, raise_on_unknown=False,
|
|
1189
|
+
attributes="all"):
|
|
1181
1190
|
if self.schema is None:
|
|
1182
1191
|
return None
|
|
1183
1192
|
allowed_attributes = []
|
|
1184
1193
|
for oc in objectclasses:
|
|
1185
1194
|
obj = self.schema.get_obj(ldap.schema.ObjectClass, oc)
|
|
1186
1195
|
if obj is not None:
|
|
1187
|
-
|
|
1196
|
+
if attributes == "must":
|
|
1197
|
+
# Only return required(must) attrs
|
|
1198
|
+
allowed_attributes += obj.must
|
|
1199
|
+
elif attributes == "may":
|
|
1200
|
+
# Only return allowed(may) attrs
|
|
1201
|
+
allowed_attributes += obj.may
|
|
1202
|
+
else:
|
|
1203
|
+
# Return both allowed & required attrs
|
|
1204
|
+
allowed_attributes += obj.must + obj.may
|
|
1188
1205
|
elif raise_on_unknown:
|
|
1189
1206
|
raise errors.NotFound(
|
|
1190
1207
|
reason=_('objectclass %s not found') % oc)
|
|
@@ -1193,7 +1210,6 @@ class LDAPClient:
|
|
|
1193
1210
|
def __enter__(self):
|
|
1194
1211
|
return self
|
|
1195
1212
|
|
|
1196
|
-
|
|
1197
1213
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
1198
1214
|
self.close()
|
|
1199
1215
|
|
|
@@ -1372,6 +1388,10 @@ class LDAPClient:
|
|
|
1372
1388
|
# value[-2:0] is empty string for the initial '\\'
|
|
1373
1389
|
value = u'\\'.join(
|
|
1374
1390
|
value[i:i+2] for i in six.moves.range(-2, len(value), 2))
|
|
1391
|
+
elif isinstance(value, datetime):
|
|
1392
|
+
value = value.strftime(
|
|
1393
|
+
LDAP_GENERALIZED_TIME_FORMAT)
|
|
1394
|
+
value = ldap.filter.escape_filter_chars(value)
|
|
1375
1395
|
else:
|
|
1376
1396
|
value = str(value)
|
|
1377
1397
|
value = ldap.filter.escape_filter_chars(value)
|
ipapython/ipautil.py
CHANGED
|
@@ -48,9 +48,9 @@ import six
|
|
|
48
48
|
from six.moves import input
|
|
49
49
|
|
|
50
50
|
try:
|
|
51
|
-
import
|
|
51
|
+
import ifaddr
|
|
52
52
|
except ImportError:
|
|
53
|
-
|
|
53
|
+
ifaddr = None
|
|
54
54
|
|
|
55
55
|
from ipapython.dn import DN
|
|
56
56
|
from ipaplatform.paths import paths
|
|
@@ -203,42 +203,37 @@ class CheckedIPAddress(UnsafeIPAddress):
|
|
|
203
203
|
:return: InterfaceDetails named tuple or None if no interface has
|
|
204
204
|
this address
|
|
205
205
|
"""
|
|
206
|
-
if
|
|
207
|
-
raise ImportError("
|
|
206
|
+
if ifaddr is None:
|
|
207
|
+
raise ImportError("ifaddr")
|
|
208
208
|
logger.debug("Searching for an interface of IP address: %s", self)
|
|
209
|
+
|
|
209
210
|
if self.version == 4:
|
|
210
|
-
|
|
211
|
+
family_ips = (
|
|
212
|
+
(ip.ip, ip.network_prefix, ip.nice_name)
|
|
213
|
+
for ips in [a.ips for a in ifaddr.get_adapters()]
|
|
214
|
+
for ip in ips if not isinstance(ip.ip, tuple)
|
|
215
|
+
)
|
|
211
216
|
elif self.version == 6:
|
|
212
|
-
|
|
217
|
+
family_ips = (
|
|
218
|
+
(ip.ip[0], ip.network_prefix, ip.nice_name)
|
|
219
|
+
for ips in [a.ips for a in ifaddr.get_adapters()]
|
|
220
|
+
for ip in ips if isinstance(ip.ip, tuple)
|
|
221
|
+
)
|
|
213
222
|
else:
|
|
214
223
|
raise ValueError(
|
|
215
224
|
"Unsupported address family ({})".format(self.version)
|
|
216
225
|
)
|
|
217
226
|
|
|
218
|
-
for
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
# newer versions of netifaces provide IPv6 netmask in format
|
|
226
|
-
# 'ffff:ffff:ffff:ffff::/64'. We have to split and use prefix
|
|
227
|
-
# or the netmask with older versions
|
|
228
|
-
ifmask = ifdata['netmask'].split(u'/')[-1]
|
|
229
|
-
|
|
230
|
-
ifaddrmask = '{addr}/{netmask}'.format(
|
|
231
|
-
addr=ifaddr,
|
|
232
|
-
netmask=ifmask
|
|
233
|
-
)
|
|
234
|
-
logger.debug(
|
|
235
|
-
"Testing local IP address: %s (interface: %s)",
|
|
236
|
-
ifaddrmask, interface)
|
|
227
|
+
for ip, prefix, ifname in family_ips:
|
|
228
|
+
ifaddrmask = "{ip}/{prefix}".format(ip=ip, prefix=prefix)
|
|
229
|
+
logger.debug(
|
|
230
|
+
"Testing local IP address: %s (interface: %s)",
|
|
231
|
+
ifaddrmask, ifname)
|
|
232
|
+
ifnet = netaddr.IPNetwork(ifaddrmask)
|
|
237
233
|
|
|
238
|
-
|
|
234
|
+
if ifnet.ip == self:
|
|
235
|
+
return InterfaceDetails(ifname, ifnet)
|
|
239
236
|
|
|
240
|
-
if ifnet.ip == self:
|
|
241
|
-
return InterfaceDetails(interface, ifnet)
|
|
242
237
|
return None
|
|
243
238
|
|
|
244
239
|
def set_ip_net(self, ifnet):
|
|
@@ -1663,9 +1658,16 @@ def remove_ccache(ccache_path=None, run_as=None):
|
|
|
1663
1658
|
"Failed to clear Kerberos credentials cache: %s", e)
|
|
1664
1659
|
|
|
1665
1660
|
|
|
1666
|
-
def remove_file(filename):
|
|
1661
|
+
def remove_file(filename, only_if_empty=False):
|
|
1667
1662
|
"""Remove a file and log any exceptions raised.
|
|
1663
|
+
|
|
1664
|
+
:only_if_empty: only remove the file if empty. Default False.
|
|
1668
1665
|
"""
|
|
1666
|
+
if only_if_empty and os.path.exists(filename):
|
|
1667
|
+
file_stat = os.stat(filename)
|
|
1668
|
+
if file_stat.st_size > 0:
|
|
1669
|
+
logger.debug('%s is not empty.', filename)
|
|
1670
|
+
return
|
|
1669
1671
|
try:
|
|
1670
1672
|
os.unlink(filename)
|
|
1671
1673
|
except Exception as e:
|
|
@@ -1674,6 +1676,15 @@ def remove_file(filename):
|
|
|
1674
1676
|
logger.error('Error removing %s: %s', filename, str(e))
|
|
1675
1677
|
|
|
1676
1678
|
|
|
1679
|
+
def remove_directory(dir):
|
|
1680
|
+
"""Remove an empty directory."""
|
|
1681
|
+
try:
|
|
1682
|
+
os.rmdir(dir)
|
|
1683
|
+
except OSError as e:
|
|
1684
|
+
if e.errno not in {errno.ENOENT, errno.ENOTEMPTY}:
|
|
1685
|
+
logger.error("Failed to remove directory %s", dir)
|
|
1686
|
+
|
|
1687
|
+
|
|
1677
1688
|
def rmtree(path):
|
|
1678
1689
|
"""
|
|
1679
1690
|
Remove a directory structure and log any exceptions raised.
|
ipapython/session_storage.py
CHANGED
|
@@ -111,7 +111,7 @@ class KRB5Error(Exception):
|
|
|
111
111
|
|
|
112
112
|
|
|
113
113
|
def krb5_errcheck(result, func, arguments):
|
|
114
|
-
"""Error checker for
|
|
114
|
+
"""Error checker for krb5_error_code return value"""
|
|
115
115
|
if result != 0:
|
|
116
116
|
raise KRB5Error(result, func.__name__, arguments)
|
|
117
117
|
|
|
@@ -119,14 +119,13 @@ def krb5_errcheck(result, func, arguments):
|
|
|
119
119
|
krb5_context = ctypes.POINTER(_krb5_context)
|
|
120
120
|
krb5_ccache = ctypes.POINTER(_krb5_ccache)
|
|
121
121
|
krb5_data_p = ctypes.POINTER(_krb5_data)
|
|
122
|
-
krb5_error = ctypes.c_int32
|
|
123
122
|
krb5_creds = _krb5_creds
|
|
124
123
|
krb5_pointer = ctypes.c_void_p
|
|
125
124
|
krb5_cc_cursor = krb5_pointer
|
|
126
125
|
|
|
127
126
|
krb5_init_context = LIBKRB5.krb5_init_context
|
|
128
127
|
krb5_init_context.argtypes = (ctypes.POINTER(krb5_context), )
|
|
129
|
-
krb5_init_context.restype =
|
|
128
|
+
krb5_init_context.restype = krb5_error_code
|
|
130
129
|
krb5_init_context.errcheck = krb5_errcheck
|
|
131
130
|
|
|
132
131
|
krb5_free_context = LIBKRB5.krb5_free_context
|
|
@@ -143,30 +142,30 @@ krb5_free_data_contents.restype = None
|
|
|
143
142
|
|
|
144
143
|
krb5_cc_default = LIBKRB5.krb5_cc_default
|
|
145
144
|
krb5_cc_default.argtypes = (krb5_context, ctypes.POINTER(krb5_ccache), )
|
|
146
|
-
krb5_cc_default.restype =
|
|
145
|
+
krb5_cc_default.restype = krb5_error_code
|
|
147
146
|
krb5_cc_default.errcheck = krb5_errcheck
|
|
148
147
|
|
|
149
148
|
krb5_cc_close = LIBKRB5.krb5_cc_close
|
|
150
149
|
krb5_cc_close.argtypes = (krb5_context, krb5_ccache, )
|
|
151
|
-
krb5_cc_close.restype =
|
|
150
|
+
krb5_cc_close.restype = krb5_error_code
|
|
152
151
|
krb5_cc_close.errcheck = krb5_errcheck
|
|
153
152
|
|
|
154
153
|
krb5_parse_name = LIBKRB5.krb5_parse_name
|
|
155
154
|
krb5_parse_name.argtypes = (krb5_context, ctypes.c_char_p,
|
|
156
155
|
ctypes.POINTER(krb5_principal), )
|
|
157
|
-
krb5_parse_name.restype =
|
|
156
|
+
krb5_parse_name.restype = krb5_error_code
|
|
158
157
|
krb5_parse_name.errcheck = krb5_errcheck
|
|
159
158
|
|
|
160
159
|
krb5_cc_set_config = LIBKRB5.krb5_cc_set_config
|
|
161
160
|
krb5_cc_set_config.argtypes = (krb5_context, krb5_ccache, krb5_principal,
|
|
162
161
|
ctypes.c_char_p, krb5_data_p, )
|
|
163
|
-
krb5_cc_set_config.restype =
|
|
162
|
+
krb5_cc_set_config.restype = krb5_error_code
|
|
164
163
|
krb5_cc_set_config.errcheck = krb5_errcheck
|
|
165
164
|
|
|
166
165
|
krb5_cc_get_principal = LIBKRB5.krb5_cc_get_principal
|
|
167
166
|
krb5_cc_get_principal.argtypes = (krb5_context, krb5_ccache,
|
|
168
167
|
ctypes.POINTER(krb5_principal), )
|
|
169
|
-
krb5_cc_get_principal.restype =
|
|
168
|
+
krb5_cc_get_principal.restype = krb5_error_code
|
|
170
169
|
krb5_cc_get_principal.errcheck = krb5_errcheck
|
|
171
170
|
|
|
172
171
|
# krb5_build_principal is a variadic function but that can't be expressed
|
|
@@ -177,32 +176,31 @@ krb5_build_principal.argtypes = (krb5_context, ctypes.POINTER(krb5_principal),
|
|
|
177
176
|
ctypes.c_uint, ctypes.c_char_p,
|
|
178
177
|
ctypes.c_char_p, ctypes.c_char_p,
|
|
179
178
|
ctypes.c_char_p, ctypes.c_char_p, )
|
|
180
|
-
krb5_build_principal.restype =
|
|
179
|
+
krb5_build_principal.restype = krb5_error_code
|
|
181
180
|
krb5_build_principal.errcheck = krb5_errcheck
|
|
182
181
|
|
|
183
182
|
krb5_cc_start_seq_get = LIBKRB5.krb5_cc_start_seq_get
|
|
184
183
|
krb5_cc_start_seq_get.argtypes = (krb5_context, krb5_ccache,
|
|
185
184
|
ctypes.POINTER(krb5_cc_cursor), )
|
|
186
|
-
krb5_cc_start_seq_get.restype =
|
|
185
|
+
krb5_cc_start_seq_get.restype = krb5_error_code
|
|
187
186
|
krb5_cc_start_seq_get.errcheck = krb5_errcheck
|
|
188
187
|
|
|
189
188
|
krb5_cc_next_cred = LIBKRB5.krb5_cc_next_cred
|
|
190
189
|
krb5_cc_next_cred.argtypes = (krb5_context, krb5_ccache,
|
|
191
190
|
ctypes.POINTER(krb5_cc_cursor),
|
|
192
191
|
ctypes.POINTER(krb5_creds), )
|
|
193
|
-
krb5_cc_next_cred.restype =
|
|
192
|
+
krb5_cc_next_cred.restype = krb5_error_code
|
|
194
193
|
krb5_cc_next_cred.errcheck = krb5_errcheck
|
|
195
194
|
|
|
196
195
|
krb5_cc_end_seq_get = LIBKRB5.krb5_cc_end_seq_get
|
|
197
196
|
krb5_cc_end_seq_get.argtypes = (krb5_context, krb5_ccache,
|
|
198
197
|
ctypes.POINTER(krb5_cc_cursor), )
|
|
199
|
-
krb5_cc_end_seq_get.restype =
|
|
198
|
+
krb5_cc_end_seq_get.restype = krb5_error_code
|
|
200
199
|
krb5_cc_end_seq_get.errcheck = krb5_errcheck
|
|
201
200
|
|
|
202
201
|
krb5_free_cred_contents = LIBKRB5.krb5_free_cred_contents
|
|
203
202
|
krb5_free_cred_contents.argtypes = (krb5_context, ctypes.POINTER(krb5_creds))
|
|
204
|
-
krb5_free_cred_contents.restype =
|
|
205
|
-
krb5_free_cred_contents.errcheck = krb5_errcheck
|
|
203
|
+
krb5_free_cred_contents.restype = None
|
|
206
204
|
|
|
207
205
|
krb5_principal_compare = LIBKRB5.krb5_principal_compare
|
|
208
206
|
krb5_principal_compare.argtypes = (krb5_context, krb5_principal,
|
|
@@ -212,7 +210,7 @@ krb5_principal_compare.restype = krb5_boolean
|
|
|
212
210
|
krb5_unparse_name = LIBKRB5.krb5_unparse_name
|
|
213
211
|
krb5_unparse_name.argtypes = (krb5_context, krb5_principal,
|
|
214
212
|
ctypes.POINTER(ctypes.c_char_p), )
|
|
215
|
-
krb5_unparse_name.restype =
|
|
213
|
+
krb5_unparse_name.restype = krb5_error_code
|
|
216
214
|
krb5_unparse_name.errcheck = krb5_errcheck
|
|
217
215
|
|
|
218
216
|
krb5_free_unparsed_name = LIBKRB5.krb5_free_unparsed_name
|
|
@@ -314,8 +312,12 @@ def get_data(princ_name, key):
|
|
|
314
312
|
checkcreds = krb5_creds()
|
|
315
313
|
# the next function will throw an error and break out of the
|
|
316
314
|
# while loop when we try to access past the last cred
|
|
317
|
-
|
|
318
|
-
|
|
315
|
+
try:
|
|
316
|
+
krb5_cc_next_cred(context, ccache, ctypes.byref(cursor),
|
|
317
|
+
ctypes.byref(checkcreds))
|
|
318
|
+
except KRB5Error:
|
|
319
|
+
break
|
|
320
|
+
|
|
319
321
|
if (krb5_principal_compare(context, principal,
|
|
320
322
|
checkcreds.client) == 1 and
|
|
321
323
|
krb5_principal_compare(context, srv_princ,
|
|
@@ -330,8 +332,6 @@ def get_data(princ_name, key):
|
|
|
330
332
|
else:
|
|
331
333
|
krb5_free_cred_contents(context,
|
|
332
334
|
ctypes.byref(checkcreds))
|
|
333
|
-
except KRB5Error:
|
|
334
|
-
pass
|
|
335
335
|
finally:
|
|
336
336
|
krb5_cc_end_seq_get(context, ccache, ctypes.byref(cursor))
|
|
337
337
|
|
ipapython/version.py
CHANGED
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
from pkg_resources import parse_version
|
|
21
21
|
|
|
22
22
|
# The full version including strings
|
|
23
|
-
VERSION = "4.
|
|
23
|
+
VERSION = "4.12.2"
|
|
24
24
|
|
|
25
25
|
# A fuller version including the vendor tag (e.g. 3.3.3-34.fc20)
|
|
26
|
-
VENDOR_VERSION = "4.
|
|
26
|
+
VENDOR_VERSION = "4.12.2"
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
# Just the numeric portion of the version so one can do direct numeric
|
|
@@ -43,11 +43,11 @@ VENDOR_VERSION = "4.10.2"
|
|
|
43
43
|
# IPA 3.2.1: NUM_VERSION=30201
|
|
44
44
|
# IPA 3.2.99: NUM_VERSION=30299 (development version)
|
|
45
45
|
# IPA 3.3.0: NUM_VERSION=30300
|
|
46
|
-
NUM_VERSION =
|
|
46
|
+
NUM_VERSION = 41202
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
# The version of the API.
|
|
50
|
-
API_VERSION = "2.
|
|
50
|
+
API_VERSION = "2.254"
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
DEFAULT_PLUGINS = frozenset(l.strip() for l in """
|
|
@@ -393,6 +393,9 @@ output_show/1
|
|
|
393
393
|
param/1
|
|
394
394
|
param_find/1
|
|
395
395
|
param_show/1
|
|
396
|
+
passkeyconfig/1
|
|
397
|
+
passkeyconfig_mod/1
|
|
398
|
+
passkeyconfig_show/1
|
|
396
399
|
passwd/1
|
|
397
400
|
permission/1
|
|
398
401
|
permission_add/1
|
|
@@ -518,6 +521,7 @@ stageuser_add/1
|
|
|
518
521
|
stageuser_add_cert/1
|
|
519
522
|
stageuser_add_certmapdata/1
|
|
520
523
|
stageuser_add_manager/1
|
|
524
|
+
stageuser_add_passkey/1
|
|
521
525
|
stageuser_add_principal/1
|
|
522
526
|
stageuser_del/1
|
|
523
527
|
stageuser_find/1
|
|
@@ -525,6 +529,7 @@ stageuser_mod/1
|
|
|
525
529
|
stageuser_remove_cert/1
|
|
526
530
|
stageuser_remove_certmapdata/1
|
|
527
531
|
stageuser_remove_manager/1
|
|
532
|
+
stageuser_remove_passkey/1
|
|
528
533
|
stageuser_remove_principal/1
|
|
529
534
|
stageuser_show/1
|
|
530
535
|
subid/1
|
|
@@ -613,6 +618,7 @@ user_add/1
|
|
|
613
618
|
user_add_cert/1
|
|
614
619
|
user_add_certmapdata/1
|
|
615
620
|
user_add_manager/1
|
|
621
|
+
user_add_passkey/1
|
|
616
622
|
user_add_principal/1
|
|
617
623
|
user_del/1
|
|
618
624
|
user_disable/1
|
|
@@ -622,6 +628,7 @@ user_mod/1
|
|
|
622
628
|
user_remove_cert/1
|
|
623
629
|
user_remove_certmapdata/1
|
|
624
630
|
user_remove_manager/1
|
|
631
|
+
user_remove_passkey/1
|
|
625
632
|
user_remove_principal/1
|
|
626
633
|
user_show/1
|
|
627
634
|
user_stage/1
|
|
@@ -651,4 +658,4 @@ vaultcontainer_show/1
|
|
|
651
658
|
whoami/1
|
|
652
659
|
""".strip().splitlines())
|
|
653
660
|
|
|
654
|
-
KRB5_BUILD_VERSION = parse_version("1.
|
|
661
|
+
KRB5_BUILD_VERSION = parse_version("1.21.3")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ipapython
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.12.2
|
|
4
4
|
Summary: FreeIPA python support library
|
|
5
5
|
Home-page: https://www.freeipa.org/
|
|
6
6
|
Download-URL: https://www.freeipa.org/page/Downloads
|
|
@@ -27,15 +27,15 @@ Classifier: Topic :: System :: Systems Administration :: Authentication/Director
|
|
|
27
27
|
Requires-Python: >=3.6.0
|
|
28
28
|
License-File: ../COPYING
|
|
29
29
|
Requires-Dist: cffi
|
|
30
|
-
Requires-Dist: cryptography
|
|
31
|
-
Requires-Dist: dnspython
|
|
32
|
-
Requires-Dist: gssapi
|
|
33
|
-
Requires-Dist: ipaplatform
|
|
30
|
+
Requires-Dist: cryptography >=1.6
|
|
31
|
+
Requires-Dist: dnspython >=1.15
|
|
32
|
+
Requires-Dist: gssapi >=1.2.0
|
|
33
|
+
Requires-Dist: ipaplatform ==4.12.2
|
|
34
34
|
Requires-Dist: netaddr
|
|
35
35
|
Requires-Dist: six
|
|
36
|
+
Provides-Extra: ifaddr
|
|
37
|
+
Requires-Dist: ifaddr ; extra == 'ifaddr'
|
|
36
38
|
Provides-Extra: ldap
|
|
37
39
|
Requires-Dist: python-ldap ; extra == 'ldap'
|
|
38
|
-
Provides-Extra: netifaces
|
|
39
|
-
Requires-Dist: netifaces ; extra == 'netifaces'
|
|
40
40
|
|
|
41
41
|
FreeIPA python support library
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
ipapython/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
ipapython/admintool.py,sha256=0TG9COpf9AQd1RLcQ-uttksESd0Kb4Dk-9sS-aGCXd0,12258
|
|
3
|
-
ipapython/certdb.py,sha256=
|
|
3
|
+
ipapython/certdb.py,sha256=1G6cIXTmoNQo_k4YGXeVeIbwbEmrqMq1xcvi-_7dP04,38021
|
|
4
4
|
ipapython/config.py,sha256=3pjybgxq42rrUmvzm4gLdboi-TmbEB5PgQ_wD9iyn-I,9406
|
|
5
|
-
ipapython/cookie.py,sha256
|
|
6
|
-
ipapython/directivesetter.py,sha256=
|
|
5
|
+
ipapython/cookie.py,sha256=-X_UojEtLPw6vx1XxBEGX17i3aLyCylFPXDQWMBN0V4,24920
|
|
6
|
+
ipapython/directivesetter.py,sha256=O1t8BtQ_sUt5ac7BQffHmLwIQczU3al-WN0Z2hXNEdg,7673
|
|
7
7
|
ipapython/dn.py,sha256=zTMMW-8XpudF_6QjeU84leH2tM3vPD7Xar6jBeCjAAc,49450
|
|
8
8
|
ipapython/dn_ctypes.py,sha256=ZJ5Q8ZhA8HnM5Xu4j-K62Q33amZfcTcPQY6i2rpu8CI,3905
|
|
9
9
|
ipapython/dnsutil.py,sha256=nxvtyaYuARFSj9Vj5GPL1HNaN2-DISf4y1zs-Bn5L3I,22125
|
|
@@ -13,17 +13,17 @@ ipapython/fqdn.py,sha256=P6OoSODkn6hQLSN3sMpLz1U7uwzpGb97l5DaI6-azCc,1220
|
|
|
13
13
|
ipapython/graph.py,sha256=tgf5gZtKSlQNKDA9vX5HlQMn57zjibtDONRx8nqwUCQ,2490
|
|
14
14
|
ipapython/ipa_log_manager.py,sha256=GNZV1HuTRrYSsNdgyw2oZVjZOESJpH91Jb9rsvhzj0E,3881
|
|
15
15
|
ipapython/ipachangeconf.py,sha256=JT5QKYgvpbVrLAR49so6XtpLoxsNDt7FEvqjmP7xcdM,20086
|
|
16
|
-
ipapython/ipaldap.py,sha256=
|
|
17
|
-
ipapython/ipautil.py,sha256=
|
|
16
|
+
ipapython/ipaldap.py,sha256=n3g9rI2x76OsgGwk0NuORaUpF5J6mMTOa9fOHOCANIo,73826
|
|
17
|
+
ipapython/ipautil.py,sha256=g-evdsEQYsVG6TVyc8rlAdZ3Uzm6lU_6yj3_oykRIUY,60574
|
|
18
18
|
ipapython/ipavalidate.py,sha256=EqKFgw4Bz3lTuT7hjRRH7_YkoGRIG1GQ-TB4oOHLKVs,3633
|
|
19
19
|
ipapython/kerberos.py,sha256=5JJ_4dqJAgVhY0Gi7OHDLM3-vG6owRFm-NVQsZKVcgg,6300
|
|
20
20
|
ipapython/kernel_keyring.py,sha256=vInQCwrH-Njknfh3U5nUkeqFdHG4ZRIUK8h0-ODu_nU,4903
|
|
21
21
|
ipapython/nsslib.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
-
ipapython/session_storage.py,sha256=
|
|
22
|
+
ipapython/session_storage.py,sha256=t7eMnPx6OAHTCajSEsMfDKFySvvllFIDwsG1HuxzYPg,13247
|
|
23
23
|
ipapython/ssh.py,sha256=aEGqBooQi4osOi5rJfdAcUZs-9V-oNJf0pci5ZchKIE,6713
|
|
24
|
-
ipapython/version.py,sha256=
|
|
25
|
-
ipapython-4.
|
|
26
|
-
ipapython-4.
|
|
27
|
-
ipapython-4.
|
|
28
|
-
ipapython-4.
|
|
29
|
-
ipapython-4.
|
|
24
|
+
ipapython/version.py,sha256=fXXQrlA-Uhafij8EQl3tCvx1mNhVVzjsw867yS1bzKA,12942
|
|
25
|
+
ipapython-4.12.2.dist-info/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
26
|
+
ipapython-4.12.2.dist-info/METADATA,sha256=yy12Nahc5ZmB3zKGCtE8PrA2dwh2EMSQGmNrLCE7kDI,1513
|
|
27
|
+
ipapython-4.12.2.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
|
|
28
|
+
ipapython-4.12.2.dist-info/top_level.txt,sha256=ND3uLjnGYtcHS21Gj-Lk9jrodr1Vzxz9ebTopaAS9WI,10
|
|
29
|
+
ipapython-4.12.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|