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 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, EMPTY_TRUST_FLAGS)
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 = self.get_cert(nickname)
994
- self._verify_cert_validity(cert)
1014
+ def verify_ca_cert(cert, nickname, minpathlen):
1015
+ self._verify_cert_validity(cert)
995
1016
 
996
- if not cert.subject:
997
- raise ValueError("has empty subject")
1017
+ if not cert.subject:
1018
+ raise ValueError("has empty subject")
998
1019
 
999
- try:
1000
- bc = cert.extensions.get_extension_for_class(
1020
+ try:
1021
+ bc = cert.extensions.get_extension_for_class(
1001
1022
  cryptography.x509.BasicConstraints)
1002
- except cryptography.x509.ExtensionNotFound:
1003
- raise ValueError("missing basic constraints")
1004
-
1005
- if not bc.value.ca:
1006
- raise ValueError("not a CA certificate")
1007
- if minpathlen is not None:
1008
- # path_length is None means no limitation
1009
- pl = bc.value.path_length
1010
- if pl is not None and pl < minpathlen:
1011
- raise ValueError(
1012
- "basic contraint pathlen {}, must be at least {}".format(
1013
- pl, minpathlen
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
- try:
1018
- ski = cert.extensions.get_extension_for_class(
1039
+ try:
1040
+ ski = cert.extensions.get_extension_for_class(
1019
1041
  cryptography.x509.SubjectKeyIdentifier)
1020
- except cryptography.x509.ExtensionNotFound:
1021
- raise ValueError("missing subject key identifier extension")
1022
- else:
1023
- if len(ski.value.digest) == 0:
1024
- raise ValueError("subject key identifier must not be empty")
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
- try:
1027
- self.run_certutil(
1028
- [
1029
- '-V', # check validity of cert and attrs
1030
- '-n', nickname,
1031
- '-u', 'L', # usage; 'L' means "SSL CA"
1032
- '-e', # check signature(s); this checks
1033
- # key sizes, sig algorithm, etc.
1034
- ],
1035
- capture_output=True)
1036
- except ipautil.CalledProcessError as e:
1037
- # certutil output in case of error is
1038
- # 'certutil: certificate is invalid: <ERROR_STRING>\n'
1039
- raise ValueError(e.output)
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
- Option, Values, OptionParser, IndentedHelpFormatter, OptionValueError)
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
- OptionParser.__init__(self, usage, option_list, option_class,
118
- version, conflict_handler, description,
119
- formatter, add_help_option, prog)
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
@@ -34,7 +34,7 @@ class Graph:
34
34
  def remove_edge(self, tail, head):
35
35
  try:
36
36
  self.edges.remove((tail, head))
37
- except KeyError:
37
+ except ValueError:
38
38
  raise ValueError(
39
39
  "graph does not contain edge: ({0}, {1})".format(tail, head)
40
40
  )
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': crypto_x509.Certificate,
752
- 'usercertificate;binary': crypto_x509.Certificate,
753
- 'cACertificate': crypto_x509.Certificate,
754
- 'cACertificate;binary': crypto_x509.Certificate,
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, crypto_x509.Certificate):
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 crypto_x509.Certificate:
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, crypto_x509.Certificate):
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=self.netaddr_ip_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 pkg_resources import parse_version
20
+ from packaging.version import parse as parse_version
21
21
 
22
22
  # The full version including strings
23
- VERSION = "4.12.2"
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.12.2"
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 = 41202
46
+ NUM_VERSION = 41301
47
47
 
48
48
 
49
49
  # The version of the API.
50
- API_VERSION = "2.254"
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
1
+ Metadata-Version: 2.4
2
2
  Name: ipapython
3
- Version: 4.12.2
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: ../COPYING
28
+ License-File: COPYING
29
29
  Requires-Dist: cffi
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
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 ; extra == '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=0TG9COpf9AQd1RLcQ-uttksESd0Kb4Dk-9sS-aGCXd0,12258
3
- ipapython/certdb.py,sha256=1G6cIXTmoNQo_k4YGXeVeIbwbEmrqMq1xcvi-_7dP04,38021
4
- ipapython/config.py,sha256=3pjybgxq42rrUmvzm4gLdboi-TmbEB5PgQ_wD9iyn-I,9406
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=zTMMW-8XpudF_6QjeU84leH2tM3vPD7Xar6jBeCjAAc,49450
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=YTmXvPuOaFe_jLbrhiETBJ45XPJEOvndXNHWy7GbgFM,9410
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=tgf5gZtKSlQNKDA9vX5HlQMn57zjibtDONRx8nqwUCQ,2490
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=n3g9rI2x76OsgGwk0NuORaUpF5J6mMTOa9fOHOCANIo,73826
17
- ipapython/ipautil.py,sha256=g-evdsEQYsVG6TVyc8rlAdZ3Uzm6lU_6yj3_oykRIUY,60574
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=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,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any