ipapython 4.12.2__py2.py3-none-any.whl → 4.13.1__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/admintool.py +41 -2
- ipapython/certdb.py +68 -42
- ipapython/config.py +11 -7
- ipapython/dn.py +1 -0
- ipapython/dogtag.py +8 -0
- ipapython/graph.py +1 -1
- ipapython/ipaldap.py +7 -8
- ipapython/ipautil.py +41 -1
- ipapython/version.py +14 -5
- {ipapython-4.12.2.dist-info → ipapython-4.13.1.dist-info}/METADATA +25 -10
- {ipapython-4.12.2.dist-info → ipapython-4.13.1.dist-info}/RECORD +14 -14
- {ipapython-4.12.2.dist-info → ipapython-4.13.1.dist-info}/WHEEL +1 -1
- {ipapython-4.12.2.dist-info → ipapython-4.13.1.dist-info/licenses}/COPYING +0 -0
- {ipapython-4.12.2.dist-info → ipapython-4.13.1.dist-info}/top_level.txt +0 -0
ipapython/admintool.py
CHANGED
|
@@ -26,7 +26,6 @@ import logging
|
|
|
26
26
|
import sys
|
|
27
27
|
import os
|
|
28
28
|
import traceback
|
|
29
|
-
from optparse import OptionGroup # pylint: disable=deprecated-module
|
|
30
29
|
|
|
31
30
|
from ipaplatform.osinfo import osinfo
|
|
32
31
|
from ipapython import version
|
|
@@ -40,6 +39,45 @@ SERVER_NOT_CONFIGURED = 2
|
|
|
40
39
|
logger = logging.getLogger(__name__)
|
|
41
40
|
|
|
42
41
|
|
|
42
|
+
def admin_cleanup_global_argv(option_parser, options, argv):
|
|
43
|
+
"""Takes option parser and generated options and scrubs sensitive arguments
|
|
44
|
+
from the global program arguments. Note that this only works for GNU GLIBC
|
|
45
|
+
as Python has no generic way to get access to the original argv values to
|
|
46
|
+
modify them in place.
|
|
47
|
+
|
|
48
|
+
The code assumes Python behavior, e.g. there are two additional args in the
|
|
49
|
+
list (/path/to/python -I ...) than what's passed as 'argv' here.
|
|
50
|
+
"""
|
|
51
|
+
import ctypes
|
|
52
|
+
import ctypes.util
|
|
53
|
+
try:
|
|
54
|
+
_c = ctypes.CDLL(ctypes.util.find_library("c"))
|
|
55
|
+
if _c._name is None:
|
|
56
|
+
return
|
|
57
|
+
_argv = ctypes.POINTER(ctypes.c_voidp).in_dll(_c, "_dl_argv")
|
|
58
|
+
# since we run as 'python -I <executable> ...', add two args
|
|
59
|
+
_argc = len(argv) + 2
|
|
60
|
+
all_options = []
|
|
61
|
+
if '_get_all_options' in dir(option_parser):
|
|
62
|
+
# OptParse parser
|
|
63
|
+
all_options = option_parser._get_all_options()
|
|
64
|
+
elif '_actions' in dir(option_parser):
|
|
65
|
+
# ArgParse parser
|
|
66
|
+
all_options = option_parser._actions
|
|
67
|
+
|
|
68
|
+
for opt in all_options:
|
|
69
|
+
if getattr(opt, 'sensitive', False):
|
|
70
|
+
v = getattr(options, opt.dest)
|
|
71
|
+
for i in range(0, _argc):
|
|
72
|
+
vi = ctypes.cast(_argv[i],
|
|
73
|
+
ctypes.c_char_p
|
|
74
|
+
).value.decode('utf-8')
|
|
75
|
+
if vi == v:
|
|
76
|
+
ctypes.memset(_argv[i], ord('X'), len(v))
|
|
77
|
+
except Exception:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
|
|
43
81
|
class ScriptError(Exception):
|
|
44
82
|
"""An exception that records an error message and a return value
|
|
45
83
|
"""
|
|
@@ -113,7 +151,7 @@ class AdminTool:
|
|
|
113
151
|
:param parser: The parser to add options to
|
|
114
152
|
:param debug_option: Add a --debug option as an alias to --verbose
|
|
115
153
|
"""
|
|
116
|
-
group = OptionGroup(parser, "Logging and output options")
|
|
154
|
+
group = config.OptionGroup(parser, "Logging and output options")
|
|
117
155
|
group.add_option("-v", "--verbose", dest="verbose", default=False,
|
|
118
156
|
action="store_true", help="print debugging information")
|
|
119
157
|
if debug_option:
|
|
@@ -149,6 +187,7 @@ class AdminTool:
|
|
|
149
187
|
cls._option_parsers[cls] = cls.option_parser
|
|
150
188
|
|
|
151
189
|
options, args = cls.option_parser.parse_args(argv[1:])
|
|
190
|
+
admin_cleanup_global_argv(cls.option_parser, options, argv)
|
|
152
191
|
|
|
153
192
|
command_class = cls.get_command_class(options, args)
|
|
154
193
|
command = command_class(options, args)
|
ipapython/certdb.py
CHANGED
|
@@ -633,7 +633,7 @@ class NSSDatabase:
|
|
|
633
633
|
pkcs12_password_file.close()
|
|
634
634
|
|
|
635
635
|
def import_files(self, files, import_keys=False, key_password=None,
|
|
636
|
-
key_nickname=None):
|
|
636
|
+
key_nickname=None, trust_flags=EMPTY_TRUST_FLAGS):
|
|
637
637
|
"""
|
|
638
638
|
Import certificates and a single private key from multiple files
|
|
639
639
|
|
|
@@ -809,7 +809,7 @@ class NSSDatabase:
|
|
|
809
809
|
|
|
810
810
|
for cert in extracted_certs:
|
|
811
811
|
nickname = str(DN(cert.subject))
|
|
812
|
-
self.add_cert(cert, nickname,
|
|
812
|
+
self.add_cert(cert, nickname, trust_flags)
|
|
813
813
|
|
|
814
814
|
if extracted_key:
|
|
815
815
|
with tempfile.NamedTemporaryFile() as in_file, \
|
|
@@ -867,6 +867,27 @@ class NSSDatabase:
|
|
|
867
867
|
cert, _start = find_cert_from_txt(result.output, start=0)
|
|
868
868
|
return cert
|
|
869
869
|
|
|
870
|
+
def get_all_certs(self, nickname):
|
|
871
|
+
"""
|
|
872
|
+
:param nickname: nickname of the certificate in the NSS database
|
|
873
|
+
:returns: list of bytes of all certificates for the nickname
|
|
874
|
+
"""
|
|
875
|
+
args = ['-L', '-n', nickname, '-a']
|
|
876
|
+
try:
|
|
877
|
+
result = self.run_certutil(args, capture_output=True)
|
|
878
|
+
except ipautil.CalledProcessError:
|
|
879
|
+
raise RuntimeError("Failed to get %s" % nickname)
|
|
880
|
+
certs = []
|
|
881
|
+
|
|
882
|
+
st = 0
|
|
883
|
+
while True:
|
|
884
|
+
try:
|
|
885
|
+
cert, st = find_cert_from_txt(result.output, start=st)
|
|
886
|
+
except RuntimeError:
|
|
887
|
+
break
|
|
888
|
+
certs.append(cert)
|
|
889
|
+
return certs
|
|
890
|
+
|
|
870
891
|
def has_nickname(self, nickname):
|
|
871
892
|
try:
|
|
872
893
|
self.get_cert(nickname)
|
|
@@ -990,53 +1011,58 @@ class NSSDatabase:
|
|
|
990
1011
|
raise ValueError('invalid for server %s' % hostname)
|
|
991
1012
|
|
|
992
1013
|
def verify_ca_cert_validity(self, nickname, minpathlen=None):
|
|
993
|
-
cert
|
|
994
|
-
|
|
1014
|
+
def verify_ca_cert(cert, nickname, minpathlen):
|
|
1015
|
+
self._verify_cert_validity(cert)
|
|
995
1016
|
|
|
996
|
-
|
|
997
|
-
|
|
1017
|
+
if not cert.subject:
|
|
1018
|
+
raise ValueError("has empty subject")
|
|
998
1019
|
|
|
999
|
-
|
|
1000
|
-
|
|
1020
|
+
try:
|
|
1021
|
+
bc = cert.extensions.get_extension_for_class(
|
|
1001
1022
|
cryptography.x509.BasicConstraints)
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1023
|
+
except cryptography.x509.ExtensionNotFound:
|
|
1024
|
+
raise ValueError("missing basic constraints")
|
|
1025
|
+
|
|
1026
|
+
if not bc.value.ca:
|
|
1027
|
+
raise ValueError("not a CA certificate")
|
|
1028
|
+
if minpathlen is not None:
|
|
1029
|
+
# path_length is None means no limitation
|
|
1030
|
+
pl = bc.value.path_length
|
|
1031
|
+
if pl is not None and pl < minpathlen:
|
|
1032
|
+
raise ValueError(
|
|
1033
|
+
"basic contraint pathlen {}, "
|
|
1034
|
+
"must be at least {}".format(
|
|
1035
|
+
pl, minpathlen
|
|
1036
|
+
)
|
|
1014
1037
|
)
|
|
1015
|
-
)
|
|
1016
1038
|
|
|
1017
|
-
|
|
1018
|
-
|
|
1039
|
+
try:
|
|
1040
|
+
ski = cert.extensions.get_extension_for_class(
|
|
1019
1041
|
cryptography.x509.SubjectKeyIdentifier)
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1042
|
+
except cryptography.x509.ExtensionNotFound:
|
|
1043
|
+
raise ValueError("missing subject key identifier extension")
|
|
1044
|
+
else:
|
|
1045
|
+
if len(ski.value.digest) == 0:
|
|
1046
|
+
raise ValueError("subject key identifier must not be empty")
|
|
1025
1047
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1048
|
+
try:
|
|
1049
|
+
self.run_certutil(
|
|
1050
|
+
[
|
|
1051
|
+
'-V', # check validity of cert and attrs
|
|
1052
|
+
'-n', nickname,
|
|
1053
|
+
'-u', 'L', # usage; 'L' means "SSL CA"
|
|
1054
|
+
'-e', # check signature(s); this checks
|
|
1055
|
+
# key sizes, sig algorithm, etc.
|
|
1056
|
+
],
|
|
1057
|
+
capture_output=True)
|
|
1058
|
+
except ipautil.CalledProcessError as e:
|
|
1059
|
+
# certutil output in case of error is
|
|
1060
|
+
# 'certutil: certificate is invalid: <ERROR_STRING>\n'
|
|
1061
|
+
raise ValueError(e.output)
|
|
1062
|
+
|
|
1063
|
+
certlist = self.get_all_certs(nickname)
|
|
1064
|
+
for cert in certlist:
|
|
1065
|
+
verify_ca_cert(cert, nickname, minpathlen)
|
|
1040
1066
|
|
|
1041
1067
|
def verify_kdc_cert_validity(self, nickname, realm):
|
|
1042
1068
|
nicknames = self.get_trust_chain(nickname)
|
ipapython/config.py
CHANGED
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
#
|
|
19
19
|
from __future__ import absolute_import
|
|
20
20
|
|
|
21
|
-
# pylint: disable=deprecated-module
|
|
22
|
-
from optparse import (
|
|
23
|
-
|
|
21
|
+
# pylint: disable=deprecated-module, disable=unused-import
|
|
22
|
+
from optparse import (Option, Values, OptionGroup, OptionParser, SUPPRESS_HELP,
|
|
23
|
+
IndentedHelpFormatter, OptionValueError, make_option)
|
|
24
24
|
# pylint: enable=deprecated-module
|
|
25
25
|
from copy import copy
|
|
26
26
|
from configparser import ConfigParser as SafeConfigParser
|
|
@@ -113,10 +113,14 @@ class IPAOptionParser(OptionParser):
|
|
|
113
113
|
description=None,
|
|
114
114
|
formatter=None,
|
|
115
115
|
add_help_option=True,
|
|
116
|
-
prog=None
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
prog=None,
|
|
117
|
+
epilog=None):
|
|
118
|
+
OptionParser.__init__(self, usage=usage, option_list=option_list,
|
|
119
|
+
option_class=option_class, version=version,
|
|
120
|
+
conflict_handler=conflict_handler,
|
|
121
|
+
description=description, formatter=formatter,
|
|
122
|
+
add_help_option=add_help_option, prog=prog,
|
|
123
|
+
epilog=epilog)
|
|
120
124
|
|
|
121
125
|
def get_safe_opts(self, opts):
|
|
122
126
|
"""
|
ipapython/dn.py
CHANGED
|
@@ -1462,4 +1462,5 @@ ATTR_NAME_BY_OID = {
|
|
|
1462
1462
|
cryptography.x509.ObjectIdentifier('2.5.4.9'): 'STREET',
|
|
1463
1463
|
cryptography.x509.ObjectIdentifier('2.5.4.17'): 'postalCode',
|
|
1464
1464
|
cryptography.x509.ObjectIdentifier('0.9.2342.19200300.100.1.1'): 'UID',
|
|
1465
|
+
cryptography.x509.ObjectIdentifier('2.5.4.97'): 'organizationIdentifier',
|
|
1465
1466
|
}
|
ipapython/dogtag.py
CHANGED
|
@@ -63,6 +63,14 @@ INCLUDED_PROFILES = {
|
|
|
63
63
|
|
|
64
64
|
DEFAULT_PROFILE = u'caIPAserviceCert'
|
|
65
65
|
KDC_PROFILE = u'KDCs_PKINIT_Certs'
|
|
66
|
+
OCSP_PROFILE = 'caOCSPCert'
|
|
67
|
+
SUBSYSTEM_PROFILE = 'caSubsystemCert'
|
|
68
|
+
AUDIT_PROFILE = 'caSignedLogCert'
|
|
69
|
+
CACERT_PROFILE = 'caCACert'
|
|
70
|
+
CASERVER_PROFILE = 'caServerCert'
|
|
71
|
+
KRA_AUDIT_PROFILE = 'caAuditSigningCert'
|
|
72
|
+
KRA_STORAGE_PROFILE = 'caStorageCert'
|
|
73
|
+
KRA_TRANSPORT_PROFILE = 'caTransportCert'
|
|
66
74
|
|
|
67
75
|
|
|
68
76
|
if six.PY3:
|
ipapython/graph.py
CHANGED
ipapython/ipaldap.py
CHANGED
|
@@ -33,7 +33,6 @@ import warnings
|
|
|
33
33
|
|
|
34
34
|
from collections import OrderedDict
|
|
35
35
|
|
|
36
|
-
from cryptography import x509 as crypto_x509
|
|
37
36
|
from cryptography.hazmat.primitives import serialization
|
|
38
37
|
|
|
39
38
|
import ldap
|
|
@@ -748,10 +747,10 @@ class LDAPClient:
|
|
|
748
747
|
'dnszoneidnsname': DNSName,
|
|
749
748
|
'krbcanonicalname': Principal,
|
|
750
749
|
'krbprincipalname': Principal,
|
|
751
|
-
'usercertificate':
|
|
752
|
-
'usercertificate;binary':
|
|
753
|
-
'cACertificate':
|
|
754
|
-
'cACertificate;binary':
|
|
750
|
+
'usercertificate': x509.IPACertificate,
|
|
751
|
+
'usercertificate;binary': x509.IPACertificate,
|
|
752
|
+
'cACertificate': x509.IPACertificate,
|
|
753
|
+
'cACertificate;binary': x509.IPACertificate,
|
|
755
754
|
'nsds5replicalastupdatestart': unicode,
|
|
756
755
|
'nsds5replicalastupdateend': unicode,
|
|
757
756
|
'nsds5replicalastinitstart': unicode,
|
|
@@ -1000,7 +999,7 @@ class LDAPClient:
|
|
|
1000
999
|
return dct
|
|
1001
1000
|
elif isinstance(val, datetime):
|
|
1002
1001
|
return val.strftime(LDAP_GENERALIZED_TIME_FORMAT).encode('utf-8')
|
|
1003
|
-
elif isinstance(val,
|
|
1002
|
+
elif isinstance(val, x509.IPACertificate):
|
|
1004
1003
|
return val.public_bytes(x509.Encoding.DER)
|
|
1005
1004
|
elif val is None:
|
|
1006
1005
|
return None
|
|
@@ -1027,7 +1026,7 @@ class LDAPClient:
|
|
|
1027
1026
|
return DNSName.from_text(val.decode('utf-8'))
|
|
1028
1027
|
elif target_type in (DN, Principal):
|
|
1029
1028
|
return target_type(val.decode('utf-8'))
|
|
1030
|
-
elif target_type is
|
|
1029
|
+
elif target_type is x509.IPACertificate:
|
|
1031
1030
|
return x509.load_der_x509_certificate(val)
|
|
1032
1031
|
else:
|
|
1033
1032
|
return target_type(val)
|
|
@@ -1381,7 +1380,7 @@ class LDAPClient:
|
|
|
1381
1380
|
]
|
|
1382
1381
|
return cls.combine_filters(flts, rules)
|
|
1383
1382
|
elif value is not None:
|
|
1384
|
-
if isinstance(value,
|
|
1383
|
+
if isinstance(value, x509.IPACertificate):
|
|
1385
1384
|
value = value.public_bytes(serialization.Encoding.DER)
|
|
1386
1385
|
if isinstance(value, bytes):
|
|
1387
1386
|
value = binascii.hexlify(value).decode('ascii')
|
ipapython/ipautil.py
CHANGED
|
@@ -119,7 +119,7 @@ class UnsafeIPAddress(netaddr.IPAddress):
|
|
|
119
119
|
if addr.version != 6:
|
|
120
120
|
raise
|
|
121
121
|
except ValueError:
|
|
122
|
-
self._net = netaddr.IPNetwork(addr, flags=
|
|
122
|
+
self._net = netaddr.IPNetwork(addr, flags=0)
|
|
123
123
|
addr = self._net.ip
|
|
124
124
|
super(UnsafeIPAddress, self).__init__(addr,
|
|
125
125
|
flags=self.netaddr_ip_flags)
|
|
@@ -266,6 +266,19 @@ class CheckedIPAddressLoopback(CheckedIPAddress):
|
|
|
266
266
|
file=sys.stderr)
|
|
267
267
|
|
|
268
268
|
|
|
269
|
+
class IPAddressDoTForwarder(str):
|
|
270
|
+
"""IPv4 or IPv6 address with added hostname as needed for DNS over TLS
|
|
271
|
+
configuration. Example: 1.2.3.4#dns.hostname.test
|
|
272
|
+
"""
|
|
273
|
+
def __init__(self, addr):
|
|
274
|
+
addr_split = addr.split("#")
|
|
275
|
+
if len(addr_split) != 2 or not valid_ip(addr_split[0]):
|
|
276
|
+
raise ValueError(
|
|
277
|
+
"DoT forwarder must be in the format "
|
|
278
|
+
"of '1.2.3.4#dns.example.test'."
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
269
282
|
def valid_ip(addr):
|
|
270
283
|
return netaddr.valid_ipv4(addr) or netaddr.valid_ipv6(addr)
|
|
271
284
|
|
|
@@ -1809,3 +1822,30 @@ def get_config_debug(context):
|
|
|
1809
1822
|
return False
|
|
1810
1823
|
|
|
1811
1824
|
return parser.get(CONFIG_SECTION, 'debug').lower() == 'true'
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
@contextmanager
|
|
1828
|
+
def log_level_override():
|
|
1829
|
+
"""The PKI python libraries log to info() which ends up polluting
|
|
1830
|
+
the ipa server installation output. Switch the log level
|
|
1831
|
+
prior to calling any PKI library functions and then restore
|
|
1832
|
+
the value in order to suppress the output. Lines like:
|
|
1833
|
+
|
|
1834
|
+
INFO Connecting to https://localhost:8443
|
|
1835
|
+
INFO Getting PKI server info from /pki/v2/info
|
|
1836
|
+
|
|
1837
|
+
This won't affect what is logged to files.
|
|
1838
|
+
"""
|
|
1839
|
+
stream_handlers = [
|
|
1840
|
+
(handler, handler.level) for handler in logging.root.handlers
|
|
1841
|
+
if type(handler) is logging.StreamHandler
|
|
1842
|
+
]
|
|
1843
|
+
for (handler, _level) in stream_handlers:
|
|
1844
|
+
handler.setLevel(logging.ERROR)
|
|
1845
|
+
try:
|
|
1846
|
+
yield
|
|
1847
|
+
except Exception as e:
|
|
1848
|
+
raise e
|
|
1849
|
+
finally:
|
|
1850
|
+
for (handler, orig_level) in stream_handlers:
|
|
1851
|
+
handler.setLevel(orig_level)
|
ipapython/version.py
CHANGED
|
@@ -17,13 +17,13 @@
|
|
|
17
17
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
18
|
#
|
|
19
19
|
|
|
20
|
-
from
|
|
20
|
+
from packaging.version import parse as parse_version
|
|
21
21
|
|
|
22
22
|
# The full version including strings
|
|
23
|
-
VERSION = "4.
|
|
23
|
+
VERSION = "4.13.1"
|
|
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.13.1"
|
|
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.12.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 = 41301
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
# The version of the API.
|
|
50
|
-
API_VERSION = "2.
|
|
50
|
+
API_VERSION = "2.257"
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
DEFAULT_PLUGINS = frozenset(l.strip() for l in """
|
|
@@ -577,6 +577,15 @@ sudorule_remove_runasgroup/1
|
|
|
577
577
|
sudorule_remove_runasuser/1
|
|
578
578
|
sudorule_remove_user/1
|
|
579
579
|
sudorule_show/1
|
|
580
|
+
sysaccount/1
|
|
581
|
+
sysaccount_add/1
|
|
582
|
+
sysaccount_del/1
|
|
583
|
+
sysaccount_disable/1
|
|
584
|
+
sysaccount_enable/1
|
|
585
|
+
sysaccount_find/1
|
|
586
|
+
sysaccount_mod/1
|
|
587
|
+
sysaccount_policy/1
|
|
588
|
+
sysaccount_show/1
|
|
580
589
|
topic/1
|
|
581
590
|
topic_find/1
|
|
582
591
|
topic_show/1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: ipapython
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.13.1
|
|
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
|
|
@@ -25,17 +25,32 @@ Classifier: Topic :: Internet :: Name Service (DNS)
|
|
|
25
25
|
Classifier: Topic :: Security
|
|
26
26
|
Classifier: Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP
|
|
27
27
|
Requires-Python: >=3.6.0
|
|
28
|
-
License-File:
|
|
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.13.1
|
|
34
34
|
Requires-Dist: netaddr
|
|
35
35
|
Requires-Dist: six
|
|
36
|
-
Provides-Extra: ifaddr
|
|
37
|
-
Requires-Dist: ifaddr ; extra == 'ifaddr'
|
|
38
36
|
Provides-Extra: ldap
|
|
39
|
-
Requires-Dist: python-ldap
|
|
37
|
+
Requires-Dist: python-ldap; extra == "ldap"
|
|
38
|
+
Provides-Extra: ifaddr
|
|
39
|
+
Requires-Dist: ifaddr; extra == "ifaddr"
|
|
40
|
+
Dynamic: author
|
|
41
|
+
Dynamic: author-email
|
|
42
|
+
Dynamic: classifier
|
|
43
|
+
Dynamic: description
|
|
44
|
+
Dynamic: download-url
|
|
45
|
+
Dynamic: home-page
|
|
46
|
+
Dynamic: license
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
Dynamic: maintainer
|
|
49
|
+
Dynamic: maintainer-email
|
|
50
|
+
Dynamic: platform
|
|
51
|
+
Dynamic: provides-extra
|
|
52
|
+
Dynamic: requires-dist
|
|
53
|
+
Dynamic: requires-python
|
|
54
|
+
Dynamic: summary
|
|
40
55
|
|
|
41
56
|
FreeIPA python support library
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
ipapython/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
ipapython/admintool.py,sha256=
|
|
3
|
-
ipapython/certdb.py,sha256=
|
|
4
|
-
ipapython/config.py,sha256=
|
|
2
|
+
ipapython/admintool.py,sha256=d9C0S5YGW0PN0OUQPN-ZsjQcJoyySlSyiU5P2z-C9Ao,13828
|
|
3
|
+
ipapython/certdb.py,sha256=wV7Lu6WRLVDNC8gZ1ZNPP9UcKa5t1omNEvbAHpgH7-s,39064
|
|
4
|
+
ipapython/config.py,sha256=iTQDsxhBxprR5d79Zo_jbQg84Ar3POaiAO0Y1qZguLI,9721
|
|
5
5
|
ipapython/cookie.py,sha256=-X_UojEtLPw6vx1XxBEGX17i3aLyCylFPXDQWMBN0V4,24920
|
|
6
6
|
ipapython/directivesetter.py,sha256=O1t8BtQ_sUt5ac7BQffHmLwIQczU3al-WN0Z2hXNEdg,7673
|
|
7
|
-
ipapython/dn.py,sha256=
|
|
7
|
+
ipapython/dn.py,sha256=9Lbw9cpygjvUSFqNCYvU-nFSQFqJYrSE1Dji8mr3Xws,49528
|
|
8
8
|
ipapython/dn_ctypes.py,sha256=ZJ5Q8ZhA8HnM5Xu4j-K62Q33amZfcTcPQY6i2rpu8CI,3905
|
|
9
9
|
ipapython/dnsutil.py,sha256=nxvtyaYuARFSj9Vj5GPL1HNaN2-DISf4y1zs-Bn5L3I,22125
|
|
10
|
-
ipapython/dogtag.py,sha256=
|
|
10
|
+
ipapython/dogtag.py,sha256=TesFrK9Mzo_gCmFsHgfm4T5R2PE3Qg1yvyw6U6xPzv4,9693
|
|
11
11
|
ipapython/errors.py,sha256=VEkqUTs5JrTmKooeFxcSPCvqx48Zy3Pa5LOxPrOlCe4,1984
|
|
12
12
|
ipapython/fqdn.py,sha256=P6OoSODkn6hQLSN3sMpLz1U7uwzpGb97l5DaI6-azCc,1220
|
|
13
|
-
ipapython/graph.py,sha256=
|
|
13
|
+
ipapython/graph.py,sha256=G-I5tJKQxvO3YokjolS3pgT-K5u8cUV2KVpknM6yBmI,2492
|
|
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=e4G_jHhyzMTH0A7IKjhmbCpsdyQ86E5SF0dz-B_QE_0,73753
|
|
17
|
+
ipapython/ipautil.py,sha256=jCz8NYj-c11Bj7LVVuzdwjHPXBFbbj_yXHHfboWckOA,61886
|
|
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
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=hC2UszYu7S_1C2lvqkfbFzLnc4oAGOgIrplaBr_0Rx0,13116
|
|
25
|
+
ipapython-4.13.1.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
|
|
26
|
+
ipapython-4.13.1.dist-info/METADATA,sha256=LsXxqGVj9nOa04v4n8eNvZrRKjFv2RGpVjlaPtlcff0,1816
|
|
27
|
+
ipapython-4.13.1.dist-info/WHEEL,sha256=Mk1ST5gDzEO5il5kYREiBnzzM469m5sI8ESPl7TRhJY,110
|
|
28
|
+
ipapython-4.13.1.dist-info/top_level.txt,sha256=ND3uLjnGYtcHS21Gj-Lk9jrodr1Vzxz9ebTopaAS9WI,10
|
|
29
|
+
ipapython-4.13.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|